很多站长买完 VPS,第一件事就是装面板、传源码、改解析,网站能跑就算完事。可真到访问量上来、或者想用一个 IP 挂好几个站点的时候,才发现默认配置处处掣肘:端口号带个冒号又丑又难记、证书配了半天还是 http、图片和 CSS 加载慢得让用户直接关页面。其实这些问题,Nginx 天生就是为它们设计的。这篇文章就按实际部署顺序,把 Nginx 的安装、虚拟主机、反向代理、HTTPS 和性能优化一次讲清,全程命令行操作,不依赖面板也能搞定。
一、安装 Nginx:两分钟把服务跑起来
Debian / Ubuntu 系的机器一条命令搞定:
apt update && apt install -y nginx
CentOS / Rocky / AlmaLinux 用 dnf:
dnf install -y nginx
装完先看版本再设开机自启:
nginx -v systemctl enable --now nginx
顺手认识一下 Nginx 的目录结构,后面所有配置都离不开它:
/etc/nginx/nginx.conf:主配置文件,全局参数都在这里;/etc/nginx/sites-available/:站点配置的存放地,一个站点一个文件;/etc/nginx/sites-enabled/:软链接目录,链接到这里才算启用;/var/www/html:默认站点根目录;/var/log/nginx/:access.log 和 error.log 两个日志都在这里。
这个「available 放文件、enabled 做软链」的机制是 Debian 系 Nginx 的习惯,好处是禁用站点时不用删配置,删掉软链就行,强烈建议沿用。
二、虚拟主机:一个 IP 挂多个站点
很多站长一台小鸡只跑一个站,白白浪费了资源。Nginx 的虚拟主机(server block)就是解决这个问题的:一个 IP 可以根据域名把请求分发到不同的站点目录。
在 sites-available 里新建一个配置文件,比如 example.com:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
然后建立软链接并启用:
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ nginx -t && systemctl reload nginx
要点有二:一是 nginx -t 是语法检查,改完配置必跑,报错会直接告诉你哪行有问题;二是启用要用 systemctl reload 而不是 restart,reload 是平滑重载,正在处理的请求不会断。
想挂第二个站?照葫芦画瓢再写一个 server block 文件就行,互不干扰。这也是为什么强烈推荐「一个站点一个配置文件」,排查问题的时候一眼就能定位。
三、反向代理:把 3000 端口藏起来
Node、Python、Java 应用跑起来默认都带端口,比如 http://IP:3000,又丑又难记,还容易暴露服务。反向代理就是把端口应用挂到域名下面,对外只暴露 80/443。
新建一个配置:
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;
}
}
那三行 proxy_set_header 千万别省:不传 Host,后端按域名做虚拟主机的应用会 404;不传真实 IP,后端的日志和防刷插件看到的全是 127.0.0.1。
如果后端是 WebSocket 服务(比如在线聊天、实时面板),还要补两行:
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
一个细节:proxy_pass http://127.0.0.1:3000 结尾不带斜杠,表示原样转发;结尾带斜杠 http://127.0.0.1:3000/ 则会去掉 location 的前缀路径再转发。两者行为不同,写错了接口会莫名 404,遇到时优先查这里。
四、HTTPS:免费证书三分钟搞定
现在没 HTTPS 的网站,浏览器直接标「不安全」,SEO 也吃亏。用 Let's Encrypt 免费证书 + certbot 自动续期,是目前最省事的方案。
apt install -y certbot python3-certbot-nginx certbot --nginx -d example.com -d www.example.com
certbot 会自动改 Nginx 配置、申请证书并配上自动跳转,全程交互两次即可。然后验证自动续期是否正常:
certbot renew --dry-run
建议顺手加一条 crontab,每月自动检查续期:
0 3 1 * * certbot renew --quiet --renew-hook "systemctl reload nginx"
想手动强制 http 跳 https,在 80 端口的 server 里加一行:
return 301 https://$host$request_uri;
如果面向的是海外用户,还可以在 443 的 server 里补一个 HSTS 头,告诉浏览器以后只走加密连接:
add_header Strict-Transport-Security "max-age=31536000" always;
五、性能优化:gzip、缓存、连接数三板斧
配置跑通了,剩下的就是让站点更快。三板斧按性价比排序,先做前两个立竿见影。
1. gzip 压缩。 文本类资源压缩后体积能小 70%,在 nginx.conf 的 http 块里加上:
gzip on; gzip_comp_level 5; gzip_types text/plain text/css application/json application/javascript image/svg+xml;
注意图片(jpg/png/webp)本身已是压缩格式,再开 gzip 只会浪费 CPU,不要加进去。
2. 静态资源缓存。 图片、CSS、JS 这类不常变的文件,让浏览器缓存一个月:
location ~* \.(css|js|jpg|jpeg|png|gif|webp|svg|ico)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
静态资源多的站点,这一条能让二次访问的加载时间直接砍半。
3. 连接数调优。 小内存小鸡别贪心,把主配置里这两项改成匹配硬件:
worker_processes auto;
events {
worker_connections 1024;
}
4. 开 HTTP/2。 把 443 的监听改成:
listen 443 ssl http2;
HTTP/2 支持多路复用,页面里小文件多的时候提速非常明显,而且只是改一行,零成本。
六、常见坑与排错速查
最后把踩过的坑集中列一下,遇到问题照着查:
- 502 Bad Gateway:90% 是后端服务没启动,或者
proxy_pass地址写错。看/var/log/nginx/error.log,会直接告诉你连不上的原因。 - 403 Forbidden:目录权限不对,或者根目录下没有 index 文件。
ls -l /var/www/example.com看一眼属主和权限,Web 用户一般是www-data。 - 证书不生效:检查
listen 443 ssl;和证书路径是否写对,改完记得systemctl reload nginx。 - 改了配置没反应:先
nginx -t确认语法没问题,再systemctl reload nginx。如果开了 CDN,记得还要去 CDN 那边刷新缓存。 - 访问日志怎么实时看:
tail -f /var/log/nginx/access.log,排查慢请求和爬虫骚扰都靠它。
Nginx 的核心其实就 server 和 location 两个块,理解了请求是怎么被域名、路径逐级分发的,剩下的配置都是往里填参数。配上反向代理和免费 HTTPS,一台 1 核 1G 的小鸡完全能同时撑起两三个站。希望这篇文章能帮你把 Nginx 真正用起来,少走弯路。