Next.js项目部署云服务器全流程(git仓库直接部署版)
TL;DR:这篇文章是关于用最简单的方法在云服务器上部署Next.js项目的简易教程。主要使用Ubuntu 22.04,(Google Cloud),pm2, screen, Nginx
一. 准备工作
- 本地项目存储到github仓库
- 准备一台云服务器。这里使用的是Ubuntu 22.04, Google Cloud
二. 云服务器准备工作
- 云服务器安装 Node.js 和 npm
- 更新系统包列表:sudo apt update
- 安装一些必要的工具:sudo apt install -y curl dirmngr apt-transport-https lsb-release ca-certificates software-properties-common
- 导入 NodeSource GPG 密钥:
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg –dearmor -o /etc/apt/keyrings/nodesource.gpg - 创建 NodeSource 仓库文件:echo “deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main” | sudo tee /etc/apt/sources.list.d/nodesource.list
- sudo apt update
- 安装 Node.js 和 npm:sudo apt install -y nodejs
- 检查:node -v npm -v
- 安装 PM2 (用于进程管理,比较容易,推荐安装)
- npm install -g pm2
三. 将 Next.js 项目传输到服务器
- 在服务器上 clone 您的仓库
- .env文件,直接从本地上传。Google Cloud提供本地上传文件服务。(注意:.开头的文件,在Linux中默认隐藏。使用)
四. 在服务器上构建您的项目
1.
cd your-nextjs-project
npm install
npm run build
2. 使用 PM2 启动您的应用
1. 创建一个名为 ecosystem.config.js
的文件,内容如下:
1
2
3
4
5
6
7
8
9
10module.exports = {
apps: [{
name: "nextjs-app",
script: "npm",
args: "start",
env: {
NODE_ENV: "production",
},
}],
}
然后运行:
1
pm2 start ecosystem.config.js
- 配置 Nginx
- 安装 Nginx:
sudo apt install nginx
(Ubuntu) 或sudo yum install nginx
(CentOS)
- 安装 Nginx:
- 检查防火墙:确保开放 80 端口(HTTP)和 443 端口(HTTPS,如果使用)
- 注意,google cloud 默认的端口是开放的,所以不需要另外设置。
- 设置 SSL。使用 Let’s Encrypt 和 Certbot 可以轻松设置免费的 SSL 证书
- sudo apt install certbot python3-certbot-nginx -y
- sudo certbot –nginx -d your_domain.com
五.启动应用
- 使用 screen 创建一个新会话:screen -S nextjs
- 在 screen 会话中,使用 PM2 启动您的应用:pm2 start npm –name “next-app” – start
- 设置 PM2 在服务器重启时自动启动您的应用:
pm2 startup systemd
pm2 save - 分离 screen 会话:按
Ctrl+A
然后按D
六. Nginx配置
sudo nano /etc/nginx/sites-available/[项目名字或者域名]例如 podcasthighlight.com
添加Nginx配置:
server {
listen 80;
listen [::]:80;
server_name podcasthighlight.com;
return 301 https://$server_name$request_uri;
}server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name podcasthighlight.com;
ssl_certificate /path/to/your/fullchain.pem;
ssl_certificate_key /path/to/your/privkey.pem;
# 推荐的 SSL 设置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# HSTS (可选,但推荐)
add_header Strict-Transport-Security “max-age=31536000; includeSubDomains” always;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection ‘upgrade’;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 可选:配置访问日志和错误日志
access_log /var/log/nginx/podcasthighlight.access.log;
error_log /var/log/nginx/podcasthighlight.error.log;
}启动 Nginx
sudo ln -s /etc/nginx/sites-available/[项目名字或者域名] /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
七.域名相关
- Google Cloud需要设置静态 IP,这个可能需要一点费用。
请注意:先设置静态IP,然后配置域名DNS,再配置SSL。