在配置nginx作为反向代理服务器时,你需要了解一些基本的概念和配置项。反向代理服务器通常用于将客户端请求转发到内部网络中的一台或多台服务器上,然后将服务器的响应返回给客户端。这对于负载均衡、缓存静态文件、ssl终止等场景非常有用。
面向日常运维:能装、能反代、能改常用参数。
一、安装
1. centos / rhel / rocky
sudo dnf install -y nginx # 或 yum sudo systemctl enable --now nginx nginx -v curl -i http://127.0.0.1
2. ubuntu / debian
sudo apt update sudo apt install -y nginx sudo systemctl enable --now nginx nginx -v
3. 官方主线源(需要较新版本时)
按 nginx.org 添加对应发行版源后再安装,适合要新特性(如较新 tls、模块)的场景。
4. 容器(常见于测试 / k8s 旁路验证)
docker run -d --name nginx -p 8080:80 nginx:stable
5. 安装后先记住的命令
| 命令 | 作用 |
|---|---|
| 检查配置语法 |
| 打印全部生效配置 |
| 平滑重载配置 |
| 同上(systemd) |
| 看进程状态 |
| 访问日志 |
| 错误日志 |
6. 配置文件一般在哪
| 系统 | 主配置 | 站点配置 |
|---|---|---|
rhel 系 |
|
|
debian 系 |
|
|
改完务必:
sudo nginx -t && sudo systemctl reload nginx
二、反向代理实战
假设本机有一个后端:127.0.0.1:3000(node/java/go 均可)。
实战 1:最简反代
/etc/nginx/conf.d/app.conf:
server {
listen 80;
server_name api.example.com; # 本地可先写 _ 或 localhost
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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;
}
}验证:
sudo nginx -t && sudo systemctl reload nginx curl -h "host: api.example.com" http://127.0.0.1/
实战 2:按路径拆到不同服务
upstream user_svc { server 127.0.0.1:3001; }
upstream order_svc { server 127.0.0.1:3002; }
server {
listen 80;
server_name api.example.com;
location /user/ {
proxy_pass http://user_svc/; # 注意末尾 /
include /etc/nginx/proxy_params; # debian 有;没有就手写 header
}
location /order/ {
proxy_pass http://order_svc/;
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_pass 末尾斜杠(必懂):
| 写法 | 请求 /user/list 实际转到 |
|---|---|
|
|
|
|
实战 3:静态前端 + api 反代(很常见)
server {
listen 80;
server_name www.example.com;
root /var/www/app/dist;
index index.html;
# 前端 spa
location / {
try_files $uri $uri/ /index.html;
}
# 接口走后端
location /api/ {
proxy_pass http://127.0.0.1:8080/api/;
proxy_http_version 1.1;
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_connect_timeout 3s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
client_max_body_size 20m;
}
}实战 4:多实例负载均衡
upstream app_backend {
least_conn;
keepalive 32;
server 10.0.1.11:8080 weight=3 max_fails=3 fail_timeout=10s;
server 10.0.1.12:8080 weight=2 max_fails=3 fail_timeout=10s;
server 10.0.1.13:8080 backup;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://app_backend;
proxy_http_version 1.1;
proxy_set_header connection "";
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;
}
}发布摘流:把某台改成 down,nginx -t && reload。
实战 5:https 反代
server {
listen 80;
server_name api.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/api.example.com.fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/api.example.com.key;
ssl_protocols tlsv1.2 tlsv1.3;
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 https;
}
}实战 6:websocket
location /ws/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header upgrade $http_upgrade;
proxy_set_header connection "upgrade";
proxy_set_header host $host;
proxy_read_timeout 3600s;
}三、常见配置项速查
1. 全局 / 事件
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 10240;
multi_accept on;
}| 项 | 含义 |
|---|---|
| worker 进程数,一般 |
| 单 worker 最大连接数 |
| 进程可打开文件数上限 |
2. http 通用
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
server_tokens off; # 隐藏版本号
client_max_body_size 20m; # 上传限制(全局默认)
}3. 反向代理相关(最常用)
| 配置项 | 作用 | 常用值 |
|---|---|---|
| 转发目标 |
|
| 传给上游的头 | host / x-forwarded-* |
| 连上游超时 |
|
| 向下游发请求超时 |
|
| 等上游响应超时 |
|
| 是否缓冲上游响应 | 默认 on;sse 常 off |
| 上游 http 版本 |
|
| 最大上传 | 按业务,如 |
| 是否先收完 body 再转 | 大上传有时可 off |
4. 静态与缓存头
location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff2)$ {
expires 30d;
add_header cache-control "public, immutable";
access_log off;
}
location = /index.html {
add_header cache-control "no-cache";
}| 项 | 作用 |
|---|---|
| 文件根目录,uri 拼在后面 |
| 路径替换(目录末尾 |
| 依次尝试文件,常用于 spa |
| 过期时间 |
| 压缩文本响应 |
5. https
| 项 | 作用 |
|---|---|
| 证书(建议全链) |
| 私钥 |
| 协议版本 |
| 加密套件(有公司基线就跟基线) |
| 开启 http/2( |
6. 限流限连
# http 段 limit_req_zone $binary_remote_addr zone=api_rate:10m rate=20r/s; limit_conn_zone $binary_remote_addr zone=api_conn:10m; # server/location 段 limit_req zone=api_rate burst=40 nodelay; limit_conn api_conn 30;
| 项 | 作用 |
|---|---|
| 平均速率 |
| 允许突发 |
| 突发立即处理,不排队等 |
| 单 ip 并发连接上限 |
7. 日志
log_format main '$remote_addr - $request_id [$time_local] '
'"$request" $status $body_bytes_sent '
'rt=$request_time urt=$upstream_response_time '
'upstream=$upstream_addr us=$upstream_status '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;排障常看:$request_time、$upstream_response_time、$upstream_status。
8. 改写与跳转
return 301 https://$host$request_uri; # 推荐:简单跳转 rewrite ^/old/(.*)$ /new/$1 permanent; # 路径改写
能用 return 就少用复杂 rewrite;少用 if。
9. ip 控制
location /admin/ {
allow 10.0.0.0/8;
allow 192.168.1.0/24;
deny all;
}10. 健康检查页(给 slb 探活)
location = /healthz {
access_log off;
return 200 'ok';
add_header content-type text/plain;
}四、一份可直接用的「生产向」反代模板
upstream app {
least_conn;
keepalive 32;
server 127.0.0.1:8080 max_fails=3 fail_timeout=10s;
}
server {
listen 80;
server_name app.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/nginx/ssl/app.fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/app.key;
ssl_protocols tlsv1.2 tlsv1.3;
server_tokens off;
client_max_body_size 20m;
access_log /var/log/nginx/app.access.log main;
error_log /var/log/nginx/app.error.log warn;
location = /healthz {
access_log off;
return 200 'ok';
add_header content-type text/plain;
}
location / {
proxy_pass http://app;
proxy_http_version 1.1;
proxy_set_header connection "";
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_connect_timeout 3s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}五、最小实战练习
- 安装 nginx,浏览器打开默认页
- 起一个后端(任意监听 3000),配实战 1 反代
- 故意停后端,观察 502 与
error.log - 把
proxy_read_timeout调很小,后端sleep,观察 504 - 加
upstream两台(可用两端口模拟),测摘流 - 配静态
dist+/api/反代 - 加 https(可用 mkcert/自签做实验)
- 加
limit_req,用ab/wrk打出 503
六、改配置时的固定口令
sudo cp /etc/nginx/conf.d/app.conf /etc/nginx/conf.d/app.conf.bak.$(date +%f-%h%m) sudo nginx -t && sudo systemctl reload nginx tail -n 50 /var/log/nginx/error.log
语法错不要强行 reload;reload 后先看状态码和错误日志。
到此这篇关于nginx安装反向代理实战及常见配置项的文章就介绍到这了,更多相关nginx反向代理配置内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论