当前位置: 代码网 > it编程>数据库>Mysql > Nginx安装反向代理实战及常见配置项

Nginx安装反向代理实战及常见配置项

2026年08月02日 Mysql 我要评论
在配置nginx作为反向代理服务器时,你需要了解一些基本的概念和配置项。反向代理服务器通常用于将客户端请求转发到内部网络中的一台或多台服务器上,然后将服务器的响应返回给客户端。这对于负载均衡、缓存静态

在配置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. 安装后先记住的命令

命令作用

nginx -t

检查配置语法

nginx -t

打印全部生效配置

nginx -s reload

平滑重载配置

systemctl reload nginx

同上(systemd)

systemctl status nginx

看进程状态

tail -f /var/log/nginx/access.log

访问日志

tail -f /var/log/nginx/error.log

错误日志

6. 配置文件一般在哪

系统主配置站点配置

rhel 系

/etc/nginx/nginx.conf

/etc/nginx/conf.d/*.conf

debian 系

/etc/nginx/nginx.conf

/etc/nginx/sites-available/ + sites-enabled/

改完务必:

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 实际转到

proxy_pass http://127.0.0.1:3001;

http://127.0.0.1:3001/user/list(保留完整 uri)

proxy_pass http://127.0.0.1:3001/;

http://127.0.0.1:3001/list(去掉 location 前缀)

实战 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;
    }
}

发布摘流:把某台改成 downnginx -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_processes

worker 进程数,一般 auto

worker_connections

单 worker 最大连接数

worker_rlimit_nofile

进程可打开文件数上限

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. 反向代理相关(最常用)

配置项作用常用值

proxy_pass

转发目标

http://upstream_name

proxy_set_header

传给上游的头

host / x-forwarded-*

proxy_connect_timeout

连上游超时

3s5s

proxy_send_timeout

向下游发请求超时

60s

proxy_read_timeout

等上游响应超时

60s300s(长任务)

proxy_buffering

是否缓冲上游响应

默认 on;sse 常 off

proxy_http_version

上游 http 版本

1.1(配合 keepalive)

client_max_body_size

最大上传

按业务,如 50m

proxy_request_buffering

是否先收完 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";
}
作用

root

文件根目录,uri 拼在后面

alias

路径替换(目录末尾 / 要小心)

try_files

依次尝试文件,常用于 spa

expires

过期时间

gzip on

压缩文本响应

5. https

作用

ssl_certificate

证书(建议全链)

ssl_certificate_key

私钥

ssl_protocols

协议版本

ssl_ciphers

加密套件(有公司基线就跟基线)

http2

开启 http/2(listen 443 ssl http2

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;
作用

rate

平均速率

burst

允许突发

nodelay

突发立即处理,不排队等

limit_conn

单 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;
    }
}

五、最小实战练习

  1. 安装 nginx,浏览器打开默认页
  2. 起一个后端(任意监听 3000),配实战 1 反代
  3. 故意停后端,观察 502 与 error.log
  4. 把 proxy_read_timeout 调很小,后端 sleep,观察 504
  5. 加 upstream 两台(可用两端口模拟),测摘流
  6. 配静态 dist + /api/ 反代
  7. 加 https(可用 mkcert/自签做实验)
  8. 加 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反向代理配置内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com