Nginx 从入门到实战:反向代理、HTTPS 与性能优化一次讲清


很多站长买完 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 真正用起来,少走弯路。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

-

MySQL 数据库实战:从安装配置到日常运维一次讲清

评 论