Nginx 是目前最流行的 Web 服务器之一,因其高性能和高并发能力,被广泛用于反向代理、负载均衡、动静分离等场景。本文将重点讲解 Nginx 的反向代理功能,从原理到配置,再到实际场景,帮你全面理解并掌握这一强大功能。
在计算机网络中,「代理」是指由第三方服务器代替客户端向其他服务器请求资源的行为。
代理有两种常见形式:
Nginx 就是一种典型的反向代理服务器。
Client --> Nginx --> Backend Server
客户端请求并不知道后端服务的实际地址,所有请求统一由 Nginx 接收并分发。
下面是一个典型的 Nginx 反向代理配置示例:
server {
listen 80;
server_name example.com;
location / {
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_pass |
设置代理目标地址 |
proxy_set_header |
设置请求头,转发客户端信息 |
将 80 端口请求转发到本地服务的 8080 端口:
proxy_pass http://localhost:8080;
按路径转发到不同服务:
location /api/ {
proxy_pass http://localhost:5000/;
}
location /admin/ {
proxy_pass http://localhost:7000/;
}
反向代理 + HTTPS:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/nginx/ssl/yourdomain.pem;
ssl_certificate_key /etc/nginx/ssl/yourdomain.key;
location / {
proxy_pass http://localhost:3000;
}
}
静态资源由 Nginx 直接处理,动态请求转发给后端:
location ~* \.(jpg|png|css|js|ico)$ {
root /var/www/static;
}
location / {
proxy_pass http://127.0.0.1:8080;
}
错误写法(会导致路径重复):
location /api/ {
proxy_pass http://localhost:5000/api/;
}
正确写法:
location /api/ {
proxy_pass http://localhost:5000/;
}
proxy_connect_timeout 60s;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
location / {
proxy_pass http://backend;
}
}
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | 后端未启动或端口错误 | 检查后端服务状态和端口 |
| 无法获取真实 IP | 未设置头部 | 加上 proxy_set_header 配置 |
| 路径错乱 | proxy_pass 拼接错误 |
检查是否使用 / 结尾 |
Nginx 的反向代理功能在现代 Web 架构中扮演着关键角色,无论是前后端分离、微服务架构,还是网关统一入口,反向代理都能大幅提升系统的安全性、灵活性与可维护性。
建议在实际项目中多尝试不同的代理配置,并结合 HTTPS、安全头、缓存等功能,打造更稳定、健壮的服务入口。
非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。
功能待开通!
nginx服务器返回200但是浏览器报错 net::ERR_INCOMPLETE_CHUNKED_ENCODING 原因是nginx在获得后端服务器返回数据时,数据过大需要存在临时文件中,但是当前运行nginx用户,没有该文件的读写权限 导致的。 如何证实 可以查看nginx的日志,会有以下类似错误 2018/03/22 16:11:35 [crit] 9519#0: *339625 open() "/var/lib/nginx/tmp/fastcgi/5/02/0000000025" failed 很明显,nginx无法写/var/lib/nginx/tmp/fastcgi/5/02/000
模式 含义 location = /uri = 表示精确匹配只有完全相等才会匹配成功 location ^~ /uri ^~ 表示对路由进行前缀匹配 location ~ /uri ~ 表示对路由进行正则匹配 location ~* /uri ~* 表示对路由进行不区分大小写的正则匹配 location /uri 不带任何修饰符也表示前缀匹配 location / 默认匹配,任何没有匹配到的uri 多个 location 配置的情况下匹配顺序为(匹配到某一等级就结束,同一规则时匹配长度长的优先): 首先精确匹配 = 其次前缀匹配 ^~ 其次是按文件中顺
推荐日志配置 log_format main 'remote_addr=[$remote_addr] http_x_forward=[$http_x_forwarded_for] time=[$time_local] request=[$request] ' 'status=[$status] byte=[$bytes_sent] elapsed=[$request_time] upstream_connect_time=[$upstream_connect_time] upstream_response_time=[$upstream_response_time] '
在使用 Nginx 做反向代理时,经常会遇到一些看似莫名其妙的问题,比如返回 502 错误、路径出错、真实 IP 丢失等等。本文总结了开发和部署中最常见的 Nginx 反向代理问题,并给出对应的排查和解决方案,帮助你快速定位和修复问题。 目录 一、502 Bad Gateway 二、路径拼接异常 三、获取不到真实客户端-IP 四、跨域请求失败 五、WebSocket 无法正常工作 六、请求体过大导致-413-错误 七、反向代理跳转失效 八、HTTPS-代理配置问题 九、文件下载异常或中断 十、缓存未生效或生效异常 总结 一、502 Bad Gateway 这个错误意味着 Nginx 无法成
stream { log_format proxy 'time=[$time_local] remote_addr=[$remote_addr]' ' protocol=[$protocol] status=[$status] byte_send=[$bytes_sent] byte_received=[$bytes_received] ' 'session_time=[$session_time] upstream_addr=[$upstream_addr] ' 'upstream_