Nginx部署
本篇记录在 Ubuntu 服务器上部署 Nginx 的完整流程:从安装、启动、配置站点,到防火墙放行、HTTPS 证书与基础安全加固。 环境以 Ubuntu 20.04 / 22.04 LTS 为例,命令均使用普通用户配合
sudo执行。
安装 Nginx
准备工作
在开始之前,先更新系统软件包索引与已安装的包,确保后续安装的是较新版本。
sudo apt update sudo apt upgrade -y
建议使用具备
sudo权限的普通用户操作,避免长期直接使用 root 账户。
安装 Nginx
Ubuntu 官方仓库中自带 Nginx,直接通过 apt 安装即可,这是最简单且便于后续维护的方式。
sudo apt install nginx -y
安装完成后查看版本,确认安装成功。
nginx -v
如果需要更新的版本,可以添加 Nginx 官方源(
nginx.org)后再安装,但对大多数场景而言官方仓库版本已经足够。
启动与开机自启
Ubuntu 使用 systemd 管理服务。安装后 Nginx 通常已自动启动,可用以下命令管理。
# 启动 sudo systemctl start nginx # 设置开机自启 sudo systemctl enable nginx # 查看运行状态 sudo systemctl status nginx
当状态显示 active (running) 时,说明 Nginx 已正常运行。
常用管理命令汇总:
| 操作 | 命令 |
|---|---|
| 启动 | sudo systemctl start nginx |
| 停止 | sudo systemctl stop nginx |
| 重启 | sudo systemctl restart nginx |
| 重载配置(不断连接) | sudo systemctl reload nginx |
| 查看状态 | sudo systemctl status nginx |
配置防火墙
如果服务器启用了 ufw 防火墙,需要放行 HTTP/HTTPS 流量,否则外部无法访问。
# 查看可用的应用配置 sudo ufw app list # 放行 HTTP 与 HTTPS(80 与 443 端口) sudo ufw allow 'Nginx Full' # 查看防火墙状态 sudo ufw status
Nginx Full同时放行 80 和 443;若暂时只用 HTTP,可用Nginx HTTP。
验证默认页面
在浏览器中访问服务器的公网 IP:
http://your_server_ip
看到 “Welcome to nginx!” 的默认欢迎页,即表示部署成功。
也可以在服务器本地用 curl 验证:
curl -I http://localhost
返回 200 OK 即正常。
目录结构说明
了解关键文件与目录的位置,便于后续配置与排查问题。
| 路径 | 说明 |
|---|---|
/etc/nginx/nginx.conf | 主配置文件 |
/etc/nginx/sites-available/ | 站点配置文件存放目录 |
/etc/nginx/sites-enabled/ | 已启用站点(通常为软链接) |
/var/www/html/ | 默认网站根目录 |
/var/log/nginx/access.log | 访问日志 |
/var/log/nginx/error.log | 错误日志 |
配置站点
以部署域名 example.com 的静态站点为例。
站点配置目录
不同来源安装的 Nginx,站点配置的存放目录并不一样:
| 安装来源 | 站点配置目录 | 启用方式 |
|---|---|---|
Ubuntu 官方仓库 apt install nginx | sites-available/ + sites-enabled/ | 在 sites-available 写配置,再软链接到 sites-enabled |
Nginx 官方源(nginx.org)/ 编译安装 | conf.d/ | 直接在 conf.d 下新建 *.conf 文件即可生效 |
判断自己属于哪一种,只需看主配置里 include 了哪个目录:
grep -n include /etc/nginx/nginx.conf
- 看到
include /etc/nginx/conf.d/*.conf;→ 用 conf.d 方式。 - 看到
include /etc/nginx/sites-enabled/*;→ 用 sites-available/enabled 方式。
如果你的
/etc/nginx下只有conf.d而没有sites-available,说明用的是官方源版本,按下面的 conf.d 方式操作即可,不需要ln -s软链接那一步。
创建网站目录与示例页面
sudo mkdir -p /var/www/example.com/html sudo chown -R $USER:$USER /var/www/example.com/html echo '<h1>Hello from example.com</h1>' > /var/www/example.com/html/index.html
这里属主用当前部署用户(
$USER),是为了方便日常上传/发布而无需sudo;Nginx 的 worker 进程(Ubuntu 仓库版是www-data,官方源版是nginx)只需要读权限,不必拥有这些文件。只有上传、缓存等需要写入的目录,才把属组设为 worker 用户并放开写权限。
在 conf.d 下新增站点配置
在 conf.d 目录下,一个站点对应一个 .conf 文件,文件名必须以 .conf 结尾,否则不会被 include 加载。
sudo vim /etc/nginx/conf.d/example.com.conf
写入基础配置(HTTP):
server { listen 80; listen [::]:80; server_name example.com www.example.com; root /var/www/example.com/html; index index.html; # 单独的访问/错误日志,便于按站点排查 access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; location / { try_files $uri $uri/ =404; } # 禁止访问隐藏文件(如 .git、.env) location ~ /\. { deny all; access_log off; log_not_found off; } }
若是 Ubuntu 仓库版(
sites-available),则把配置写到/etc/nginx/sites-available/example.com,再执行sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/启用。
测试并重载配置
每次修改配置后,先测试语法再重载,避免错误配置导致服务异常。
# 测试配置语法 sudo nginx -t # 语法正确后重载 sudo systemctl reload nginx
nginx -t输出syntax is ok与test is successful才可以放心重载。
配置 HTTPS(SSL)
准备证书
证书有两种常见来源:
- 从 CA / 云厂商下载(如腾讯云、阿里云签发):会得到一个证书文件(通常是
xxx_bundle.crt,已包含中间证书链)和一个私钥文件(xxx.key)。上传到服务器即可。 - Let’s Encrypt 自动签发:
sudo apt install certbot python3-certbot-nginx,再sudo certbot --nginx -d example.com -d www.example.com,certbot 会自动申请并写入配置,且能自动续期(sudo certbot renew --dry-run可测试)。
手动上传的证书,建议放在专门目录并收紧私钥权限:
sudo mkdir -p /etc/nginx/ssl # 把 bundle.crt 与 .key 上传到该目录后: sudo chmod 600 /etc/nginx/ssl/example.com.key # 私钥仅 root 可读
站点配置
以下是一个示例配置,包含 HTTP 自动跳转 HTTPS、HTTPS 主站点、证书配置、安全优化等:
# HTTP:强制跳转 HTTPS server { listen 80; listen [::]:80; server_name example.com www.example.com; # 用 $host 保留用户访问的原始域名(www 不会被改写成裸域名) return 301 https://$host$request_uri; } # HTTPS 主站点 server { listen 443 ssl; listen [::]:443 ssl; http2 on; # nginx ≥ 1.25.1 用独立指令开启 HTTP/2 server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com_bundle.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL 安全优化 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; # HSTS:强制浏览器后续始终走 HTTPS(确认全站 HTTPS 稳定后再开启) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; root /var/www/example.com/html; index index.html index.htm; access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; location / { try_files $uri $uri/ =404; } error_page 500 502 503 504 /50x.html; location ~ /\. { deny all; access_log off; log_not_found off; } }
改完同样执行 sudo nginx -t && sudo systemctl reload nginx。
配置反向代理
若后端运行着应用服务(如监听 3000 端口的 Node 服务),可让 Nginx 作为反向代理。
server { listen 80; server_name app.example.com; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; 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; } }
基础安全加固
以下配置可提升站点安全性,建议加入主配置或 server 块中。
隐藏版本号
在 /etc/nginx/nginx.conf 的 http 块中添加,避免暴露具体版本:
http { server_tokens off; # ... }
添加安全响应头
在 server 块中添加常用安全头:
add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always;
限制请求体大小
防止过大请求占用资源:
client_max_body_size 10M;
修改后照例执行 sudo nginx -t && sudo systemctl reload nginx 使其生效。