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 nginxsites-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 oktest 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.confhttp 块中添加,避免暴露具体版本:

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 使其生效。