您的位置:首页 > 路由器知识路由器知识

2024年Nginx必学5大实用配置!新手也能看懂的服务器神操作

2026-04-08人已围观

2024年Nginx必学5大实用配置!新手也能看懂的服务器神操作

作为一个在代码圈摸爬滚打多年的"野路子程序员",今天必须跟各位刚入行的兄弟掏心窝子聊聊——Nginx这玩意儿到底有多香!你是不是也遇到过前后端分离项目要开两个端口的麻烦?是不是配置HTTPS时总跳各种奇怪的错误?别慌,今天这篇超接地气的教程,保证让你半小时从小白变大神,所有配置代码直接复制就能用,绝对是你服务器运维的通关秘籍!

一、前后端项目"合二为一"的秘密武器

现在做网站基本都是前端一个端口(比如Vue项目跑在8080端口),后端API又占一个端口(比如Spring Boot跑在4443端口)。这种"两地分居"的部署方式,不仅开发时要处理跨域问题,上线后还得维护两个端口,对小项目来说简直是折腾人!

生活比喻:这就像你开了家奶茶店,点单在街东头,取餐在街西头,顾客跑来跑去麻烦不说,还容易跑丢客人。咱们要做的就是把两个窗口合并到一个柜台,客人从一个门进来就能搞定所有事。

同一域名下的"端口合并术"

核心思路就是用Nginx当"前台接待员",不管用户访问网站的哪个部分,都先经过Nginx处理。我们只需要在Nginx里加一段配置,告诉它:"如果有人访问以/api开头的地址,你就悄悄把请求转到后端的4443端口去,别让用户知道。"

```nginx

server {

listen 80;

server_name example.com; 你的域名

关键配置:处理/api开头的后端请求

location ^~ /api/ {

proxy_pass http://127.0.0.1:4443/; 后端服务地址,注意结尾的/不能少

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;

}

处理前端静态文件

location / {

root /var/www/frontend; 前端项目存放目录

index index.html;

try_files $uri $uri/ /index.html; 解决单页应用路由问题

}

}

```

配置里的"小九九"

这里有个特别容易踩坑的地方:`location ^~ /api/` 里面的 `^~` 符号是"非正则匹配"的意思,就像告诉Nginx:"看到以/api/开头的地址,你就直接用这个规则,别再往下找其他规则了"。如果写成 `location /api/`(没有^~),Nginx可能会匹配到其他更具体的规则,导致代理失效。

还有个关键点是 `proxy_pass` 后面的地址必须以 `/` 结尾!这就像你寄快递时,地址必须写详细到门牌号,不然快递员可能把包裹放到小区门口而不是你家门口。如果少了这个 `/`,当用户访问 `example.com/api/user` 时,Nginx会把请求转发到 `http://127.0.0.1:4443/api/user`,而不是我们期望的 `http://127.0.0.1:4443/user`。

二、HTTPS配置:让你的网站穿上"安全马甲"

现在的网站如果不加HTTPS,就像出门不锁门一样危险。但很多新手配置HTTPS时总会遇到各种奇葩问题,比如明明开了HTTPS,用户用HTTP访问却提示"无法访问",或者浏览器地址栏总是显示"不安全"。别担心,这部分我会手把手教你搞定!

非标准HTTPS端口的"跳转魔法"

有些时候我们需要用非标准端口(比如2083)来跑HTTPS服务,这时候如果用户用HTTP协议访问这个端口,就会看到一个让人头大的错误:`The plain HTTP request was sent to HTTPS port`(简单说就是:你发了个普通邮件,却投到了加密邮箱的邮筒里)。

解决办法很简单,在Nginx配置里加一段"端口转换器":

```nginx

server {

listen 2083;

server_name example.com;

检测到HTTP请求时自动转换为HTTPS

if ($scheme = http) {

return 301 https://$host:2083$request_uri;

}

HTTPS配置

ssl on;

ssl_certificate /etc/nginx/ssl/cert.pem; 证书文件路径

ssl_certificate_key /etc/nginx/ssl/key.pem; 密钥文件路径

其他SSL参数...

}

```

HTTP强制跳转HTTPS:不给"不安全"留机会

为了让所有用户都用HTTPS访问,我们需要在80端口(HTTP默认端口)设置一个"交通警察",只要看到HTTP请求就立刻"指挥"它转向HTTPS端口:

```nginx

server {

listen 80;

server_name example.com www.example.com;

永久重定向到HTTPS

return 301 https://$host$request_uri;

}

```

这个配置超级简单但非常关键!它能确保不管用户输入 `example.com` 还是 `http://example.com`,最终都会被转到 `https://example.com`,从源头上杜绝不安全的访问。

HSTS:让浏览器"长记性"

就算配置了HTTP跳转HTTPS,还是有安全隐患:第一次访问时用户可能还是会先用HTTP连接。这时候HSTS(HTTP Strict Transport Security)就派上用场了,它相当于给浏览器贴了个便签:"以后访问这个网站,直接用HTTPS,不许用HTTP!"

```nginx

server {

listen 443 ssl;

server_name example.com;

HSTS配置,有效期1年(31536000秒)

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

其他SSL配置...

}

```

这里的参数解释一下:

- `max-age=31536000`:告诉浏览器1年内都直接用HTTPS访问

- `includeSubDomains`:子域名也一起生效(比如blog.example.com)

- `preload`:申请加入浏览器内置的"HTTPS白名单",即使是第一次访问也会用HTTPS

- `always`:确保所有响应(包括404、500等错误页面)都带上这个头

三、Nginx反向代理:服务器界的"万能转换器"

反向代理这东西听起来高大上,其实就是"中间人"的角色。打个比方,你去餐厅吃饭,不需要直接跟后厨打交道,只需要跟服务员(Nginx)说你想吃什么,服务员再把订单传给后厨(真正的服务器),做好了再给你端上来。

反向代理的"超能力"

反向代理能帮我们解决很多实际问题:

- 隐藏真实服务器地址,提高安全性

- 负载均衡,把请求分配到多个服务器

- 缓存静态内容,提高访问速度

- 解决跨域问题,就像我们前面讲的前后端合并

实用反向代理配置示例

1. 基础反向代理

```nginx

location /app/ {

proxy_pass http://127.0.0.1:8080/;

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;

}

```

2. 带缓存的反向代理

```nginx

location /static/ {

proxy_pass http://127.0.0.1:8080/static/;

proxy_cache my_cache; 缓存名称

proxy_cache_valid 200 304 12h; 200和304状态码缓存12小时

proxy_cache_valid any 1m; 其他状态码缓存1分钟

proxy_cache_use_stale error timeout invalid_header updating;

proxy_cache_lock on; 防止缓存击穿

}

```

3. 负载均衡配置

```nginx

在http块中定义负载均衡组

upstream backend_servers {

server 192.168.1.10:8080 weight=5; 权重5,接收50%请求

server 192.168.1.11:8080 weight=3; 权重3,接收30%请求

server 192.168.1.12:8080 weight=2; 权重2,接收20%请求

}

在server块中使用

location / {

proxy_pass http://backend_servers;

proxy_set_header Host $host;

其他代理参数...

}

```

四、Nginx端口转发:内网服务的"透视镜"

有时候我们需要让外网能访问内网的服务(比如内网的数据库、游戏服务器),但又不想直接把内网服务器暴露到公网,这时候Nginx的端口转发功能就像给内网服务开了个"透视窗口",既安全又方便。

端口转发实战:把内网MySQL"搬"到公网

比如我们有台内网服务器 `192.168.1.2` 上跑着MySQL(默认3306端口),想让外网通过Nginx服务器的33062端口访问到这个MySQL:

```nginx

stream {

定义转发规则

server {

listen 33062; Nginx对外暴露的端口

proxy_pass 192.168.1.2:3306; 内网MySQL地址和端口

proxy_connect_timeout 10s;

proxy_timeout 300s; 连接超时时间,数据库连接需要长一点

}

}

```

注意:端口转发配置是写在 `stream` 块里的,而不是我们之前常用的 `http` 块。这就像邮局的包裹分拣系统,普通信件(HTTP请求)走一个分拣区,包裹(TCP流量)走另一个分拣区。

安全小贴士

端口转发虽然方便,但也有安全风险。建议加上IP限制,只允许特定IP访问:

```nginx

stream {

server {

listen 33062;

proxy_pass 192.168.1.2:3306;

只允许指定IP访问

allow 123.123.123.123; 你的固定IP

deny all; 拒绝其他所有IP

}

}

```

五、新手避坑清单:这些错误90%的人都犯过

1. 忘记加proxy_set_header参数:代理时不设置Host和IP头,会导致后端服务获取不到真实的客户端IP和域名。

2. proxy_pass结尾漏写`/`:导致URL路径错误,比如把 `/api/user` 转发成 `/api/api/user`。

3. HSTS配置少了`always`参数:错误页面不返回HSTS头,给攻击者可乘之机。

4. 把stream配置写到http块里:端口转发需要单独的stream块,写在http里不会生效。

5. SSL证书路径错误:配置完HTTPS后访问提示"无法安全连接",90%是证书路径写错了。

6. 权限问题:Nginx启动用户没有静态文件目录的读取权限,导致403错误。

7. 正则表达式陷阱:location使用正则匹配时,`/` 和 `/index.html` 的匹配顺序问题。

8. 缓存配置不当:动态内容设置了过长缓存,导致更新不及时。

9. 没有设置try_files:单页应用刷新后404,因为没有指向index.html。

10. 不重启Nginx:改了配置文件后忘记执行 `nginx -s reload`,结果白忙活半天。

六、5个常见问题解决:专治各种不服

问题1:配置完反向代理后,网站样式全乱了?

解决:这是因为前端页面引用的CSS、JS等静态资源路径不对。检查前端代码里的资源引用路径,确保使用相对路径或正确的绝对路径。如果是Vue/React项目,记得在打包时设置正确的`publicPath`。

问题2:Nginx启动时报"address already in use"?

解决:这个端口被其他程序占用了。用 `netstat -tulpn | grep 端口号` 找到占用端口的进程,要么停掉那个进程,要么换个端口。

问题3:HTTPS配置后浏览器提示"证书不受信任"?

解决:要么是用了自签名证书(浏览器不信任),要么是证书链不完整。建议用Let's Encrypt申请免费的可信证书,或者检查证书文件是否包含完整的证书链。

问题4:反向代理WebSocket总是断开连接?

解决:WebSocket需要特殊配置,在location里加上这几句:

```nginx

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

```

问题5:Nginx访问日志里出现大量408错误?

解决:408是请求超时,说明客户端没在规定时间内发完请求。可以适当调大 `client_header_timeout` 和 `client_body_timeout` 参数:

```nginx

client_header_timeout 60s; 默认60s,可根据需要调整

client_body_timeout 60s;

```

七、10个实用小技巧:让你的Nginx飞起来

1. 启用Gzip压缩:能让网页体积减少60%以上,加载速度嗖嗖快!

```nginx

gzip on;

gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

```

2. 设置浏览器缓存:静态资源(图片、CSS、JS)设置长缓存,减轻服务器压力。

```nginx

location ~ \.(jpg|jpeg|png|gif|ico|css|js)$ {

expires 30d; 缓存30天

add_header Cache-Control "public, max-age=2592000";

}

```

3. 限制请求频率:防止恶意请求搞垮服务器。

```nginx

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

location / {

limit_req zone=one burst=20 nodelay; 最多允许20个并发请求

}

```

4. 隐藏Nginx版本号:减少被攻击的风险。

```nginx

server_tokens off;

```

5. 配置防盗链:防止别人偷用你的图片、视频等资源。

```nginx

location ~ \.(jpg|jpeg|png|gif|mp4)$ {

valid_referers none blocked example.com .example.com;

if ($invalid_referer) {

return 403; 非指定域名引用返回403

}

}

```

6. 启用HTTP/2:比HTTP/1.1快得多,只需要在listen后面加http2。

```nginx

listen 443 ssl http2;

```

7. 自定义错误页面:把丑丑的默认错误页换成自己设计的页面。

```nginx

error_page 404 /404.html;

location = /404.html {

root /var/www/errors;

internal; 只允许内部重定向访问

}

```

8. 设置字符集:避免中文乱码。

```nginx

charset utf-8;

```

9. 启用TCP Fast Open:加速连接建立,需要内核支持。

```nginx

listen 80 fastopen=3;

```

10. 定期自动更新证书:用Let's Encrypt的话,配合certbot自动续期。

```bash

设置crontab自动续期

0 0 1 certbot renew --quiet && nginx -s reload

```

八、长期使用体验:老司机的经验之谈

用Nginx也有五六年了,从一开始只会改改端口号,到现在能搭建复杂的负载均衡集群,真心觉得这玩意儿是程序员的必备技能。分享几点实际使用中的心得:

1. 配置文件一定要备份:每次改配置前养成备份习惯,出问题了能快速回滚。我一般会这样命名:`nginx.conf.bak.20240111`,带上日期方便追溯。

2. 善用include拆分配置:当配置越来越多时,把不同功能的配置拆到不同文件,用include引入主配置,这样维护起来清爽多了。比如:

```nginx

http {

include mime.types;

include conf.d/.conf; 加载conf.d目录下所有.conf文件

include vhosts/.conf; 虚拟主机配置单独放

}

```

3. 日志分析很重要:定期查看Nginx日志,能发现很多问题。推荐用GoAccess工具分析日志,能生成直观的报表,看看哪些页面访问量大,哪些IP在搞事情。

4. 警惕过度优化:Nginx默认配置已经很不错了,不要盲目抄网上的"优化脚本",很多参数对小网站根本没必要,甚至可能起反作用。

5. 安全配置要跟上:定期更新Nginx版本,及时修复安全漏洞。可以关注Nginx官方博客或安全公告,重大漏洞要第一时间处理。

话说回来,Nginx就像一把瑞士军刀,功能强大但上手不难。今天讲的这些配置,涵盖了从基础到进阶的常用场景,只要动手实践一遍,你就能轻松掌握。记住,服务器配置没有银弹,最好的方案永远是根据自己的实际需求来调整。希望这篇文章能帮你少走弯路,让你的服务器跑得又快又稳!