1. Nginx代理服务概述
Nginx 作为代理服务可以实现很多的协议代理, 我们主要以 http 代理为主。

正向代理(内部上网)

反向代理

正向代理与反向代理的区别:
- 代理的对象不一样;
- 正向代理代理的对象是客户端;
- 反向代理代理的对象是服务端;
1.1 Nginx代理配置语法
1.1.1 Nginx代理配置语法
| Syntax: proxy_pass URL; |
| Default: — |
| Context: location, if in location, limit_except |
| http://localhost:8000/uri/ |
| http://192.168.1.1:8000/uri/ |
| http://unix:/tmp/backend.socket:/uri/ |
1.1.2 类似于nopush缓冲区
| //尽可能收集所有头请求, |
| Syntax: proxy_buffering on | off; |
| Default: |
| proxy_buffering on; |
| Context: http, server, location |
| //扩展: |
| proxy_buffer_size |
| proxy_buffers |
| proxy_busy_buffer_size |
1.1.3 跳转重定向
| Syntax: proxy_redirect default; |
| proxy_redirect off;proxy_redirect redirect replacement; |
| Default: proxy_redirect default; |
| Context: http, server, location |
1.1.4 头信息
| Syntax: proxy_set_header field value; |
| Default: proxy_set_header Host $proxy_host; |
| proxy_set_header Connection close; |
| Context: http, server, location |
| //扩展: |
| proxy_hide_header |
| proxy_set_body |
1.1.5 代理到后端的TCP连接超时
| Syntax: proxy_connect_timeout time; |
| Default: proxy_connect_timeout 60s; |
| Context: http, server, location |
| //扩展 |
| proxy_read_timeout //以及建⽴ |
| proxy_send_timeout //服务端请求完, 发送给客户端时间 |
1.1.6 Proxy常见配置项
| $ vim /etc/nginx//proxy_params |
| proxy_redirect default; |
| proxy_set_header Host $http_host; |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| proxy_connect_timeout 30; |
| proxy_send_timeout 60; |
| proxy_read_timeout 60; |
| proxy_buffer_size 32k; |
| proxy_buffering on; |
| proxy_buffers 4 128k; |
| proxy_busy_buffers_size 256k; |
| proxy_max_temp_file_size 256k; |
| //具体location实现 |
| location / { |
| proxy_pass http://127.0.0.1:8080; |
| include proxy_params; |
| } |
1.2 Nginx正向代理示例

| //配置69.113访问限制,仅允许同⽹段访问 |
| location ~ .*\.(jpg|gif|png)$ { |
| allow 192.168.69.0/24; |
| deny all; |
| root /soft/code/images; |
| //配置正向代理 |
| [root@Nginx ~]# cat /etc/nginx/conf.d/zy_proxy.conf |
| server { |
| listen 80; |
| resolver 233.5.5.5; // 正向代理使用的DNS |
| location / { |
| proxy_pass http://$http_host$request_uri; //写到这里就可以实现正向代理的作用,下面的信息是为了捕捉客户端头部信息 |
| proxy_set_header Host $http_host; |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| } |
| } |
由于没有安装正向代理相关软件,所以本地无法测试!
1.3 Nginx反向代理示例

| $ vim proxy.conf |
| server { |
| listen 80; |
| server_name proxy.lzj.com; |
| index index.html; |
| location / { |
| proxy_pass http://192.168.1.2:8080; |
| include proxy_params; // 这里引用的是1.1.6步骤定义的常见配置选项 |
| } |
| } |
| |
| $ vim images.conf |
| server { |
| listen 8080; |
| server_name image.lzj.com; |
| location ~ .*\.(png|jpg|gif)$ { |
| gzip on; |
| root /usr/share/nginx/html/images; |
| } |
| } |

2. 负载均衡
负载均衡主要就是为了提升吞吐量、提升请求性能、提高容灾!
2.1 实现Nginx负载均衡
Nginx实现负载均衡用到了proxy_pass
代理模块核心配置,将客户端请求代理转发到一组upstream
虚拟服务池!
upstream虚拟配置语法:
| Syntax: upstream name { ... } |
| Default: - |
| Context: http |
| //upstream例⼦ |
| upstream backend { |
| server backend1.example.com weight=5; |
| server backend2.example.com:8080; |
| server unix:/tmp/backend3; |
| server backup1.example.com:8080 backup; |
| } |
| server { |
| location / { |
| proxy_pass http://backend; |
| } |
| } |
2.1.1 创建对应的html文件
| $ mkdir /usr/share/nginx/html/{code1,code2,code3} |
| $ vim /usr/share/nginx/html/code1/index.html |
| <html> |
| <title>Code1</title> |
| <body bgcolor="red"> |
| <h1>Code1-8081</h1> |
| </body> |
| </html> |
| |
| $ vim /usr/share/nginx/html/code2/index.html |
| <html> |
| <title> Coder2</title> |
| <body bgcolor="blue"> |
| <h1>Code1-8082</h1> |
| </body> |
| </html> |
| |
| $ vim /usr/share/nginx/html/code3/index.html |
| <html> |
| <title> Coder3</title> |
| <body bgcolor="green"> |
| <h1>Code1-8083</h1> |
| </body> |
| </html> |
2.1.2 创建对应的conf文件
| $ vim releserver.conf |
| server { |
| listen 8081; |
| root /usr/share/nginx/html/code1; |
| index index.html; |
| } |
| server { |
| listen 8082; |
| root /usr/share/nginx/html/code2; |
| index index.html; |
| } |
| server { |
| listen 8083; |
| root /usr/share/nginx/html/code3; |
| index index.html; |
| } |
2.1.3 配置Nginx反向代理
| $ vim proxy_pass.conf |
| upstream node { |
| server 192.168.1.2:8081; |
| server 192.168.1.2:8082; |
| server 192.168.1.2:8083; |
| } |
| |
| server { |
| server_name proxy_pass.lzj.com; |
| listen 80; |
| location / { |
| proxy_pass http://node; |
| include proxy_params; |
| } |
| } |
2.1.4 浏览器验证



2.2 Nginx负载均衡状态配置
后端服务器在负载均衡调度中的状态
状态 |
概述 |
down |
当前的server暂时不参与负载均衡 |
backup |
预留的备份服务器 |
max_fails |
允许请求失败的次数 |
fail_timeout |
经过max_fails失败后,服务暂停时间 |
max_conns |
限制最大的接收连接数 |
测试 backup以及down状态
| $ vim proxy_pass.conf |
| upstream load_pass { |
| server 192.168.1.1:8001 down; |
| server 192.168.1.2:8002 backup; |
| server 192.168.1.3:8003 max_fails=1 fail_timeout=10s; |
| } |
| location / { |
| proxy_pass http://load_pass; |
| include proxy_params; |
| } |
| |
| //关闭8003进行测试 |
2.3 Nginx负载均衡调度策略
调度算法 |
概述 |
轮询 |
按时间顺序逐⼀分配到不同的后端服务器(默认) |
weight |
加权轮询,weight值越⼤,分配到的访问⼏率越⾼ |
ip_hash |
每个请求按访问IP的hash结果分配,这样来⾃同⼀IP的固定访问⼀个后端服务器 |
url_hash |
按照访问URL的hash结果来分配请求,是每个URL定向到同⼀个后端服务器 |
least_conn |
最少链接数,那个机器链接数少就分发 |
hash关键数值 |
hash⾃定义的key |
权重轮询配置
| upstream load_pass { |
| server 192.168.1.1:8001; |
| server 192.168.1.2:8002 weight=5; |
| server 192.168.1.3:8003; |
| } |
ip_hash配置
| //如果客户端都⾛相同代理, 会导致某⼀台服务器连接过多 |
| upstream load_pass { |
| ip_hash; |
| server 192.168.1.1:8001; |
| server 192.168.1.2:8002; |
| server 192.168.1.3:8003; |
| } |
| //如果出现通过代理访问会影响后端节点接收状态均衡 |
url_hash配置
| upstream load_pass { |
| hash $request_uri; |
| server 192.168.1.1:8001; |
| server 192.168.1.2:8002; |
| server 192.168.1.3:8003; |
| } |
| |
| //针对三台服务器添加相同⽂件 |
| /usr/share/nginx/html/code1/url1.html url2.html url3.html |
| /usr/share/nginx/html/code2/url1.html url2.html url3.html |
| /usr/share/nginx/html/code3/url1.html url2.html url3.html |
2.4 Nginx负载均衡TCP配置
Nginx四层代理仅能存在于main段,不可定义在http字段中!
| $ vim /etc/nginx/nginx.conf |
| stream { |
| upstream ssh_proxy { |
| hash $remote_addr consistent; |
| server 192.168.1.2:22; |
| } |
| upstream mysql_proxy { |
| hash $remote_addr consistent; |
| server 192.168.1.2:3306; |
| } |
| server { |
| listen 6666; |
| proxy_connect_timeout 1s; |
| proxy_timeout 300s; |
| proxy_pass ssh_proxy; |
| } |
| server { |
| listen 5555; |
| proxy_connect_timeout 1s; |
| proxy_timeout 300s; |
| proxy_pass mysql_proxy; |
| } |
| } |
3. Nginx动静分离
动静分离,通过中间件将动态请求和静态请求进⾏分离, 分离资源, 减少不必要的请求消耗, 减少请求延时。
好处: 动静分离后, 即使动态服务不可⽤, 但静态资源不会受到影响
通过中间件将动态请求和静态请求分离!

3.1 Nginx动静分离应用案例

3.1.1 环境准备
OS |
service |
IP |
Centos 7.2 |
proxy |
192.168.1.1 |
Centos 7.2 |
nginx |
192.168.1.2 |
Centos 7.2 |
tomcat |
192.168.1.2 |
3.1.2 在192.168.1.2准备静态资源
| $ vim /etc/nginx/conf.d/access.conf |
| server{ |
| listen 80; |
| root /usr/share/nginx/html/code; |
| index index.html; |
| location ~.*\.(png|jpg|gif)$ { |
| gzip on; |
| root /usr/share/nginx/html/code/images; |
| } |
| } |
| $ mkdir /usr/share/nginx/html/code/images -p |
| $ wget -O /usr/share/nginx/html/code/images/nginx.png http://nginx.org/nginx.png |
| $ nginx -t |
| $ systemctl reload nginx |
| # 准备目录以及静态相关图片 |
3.1.3 在192.168.1.2上准备动态资源
| $ wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-9/v9.0.36/bin/apache-tomcat-9.0.36.tar.gz |
| $ mkdir -p /soft/app |
| $ tar zxf apache-tomcat-9.0.36.tar.gz -C /soft/app/ |
| $ vim /soft/app/apache-tomcat-9.0.36/webapps/ROOT/java_test.jsp |
| <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> |
| <HTML> |
| <HEAD> |
| <TITLE>JSP Test Page</TITLE> |
| </HEAD> |
| <BODY> |
| <% |
| Random rand = new Random(); |
| out.println("<h1>Random number:</h1>"); |
| out.println(rand.nextInt(99)+100); |
| %> |
| </BODY> |
| </HTML> |
| $ /soft/app/apache-tomcat-9.0.36/bin/startup.sh |
3.1.4 192.168.1.2访问动态资源测试

3.1.5 在192.168.1.2配置负载均衡,实现访问jsp和png资源
| $ yum install nginx -y |
| $ vim /etc/nginx/proxy_params |
| proxy_redirect default; |
| proxy_set_header Host $http_host; |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| proxy_connect_timeout 30; |
| proxy_send_timeout 60; |
| proxy_read_timeout 60; |
| proxy_buffer_size 32k; |
| proxy_buffering on; |
| proxy_buffers 4 128k; |
| proxy_busy_buffers_size 256k; |
| proxy_max_temp_file_size 256k; |
| |
| $ vim /etc/nginx/conf.d/proxy.conf |
| upstream static { |
| server 192.168.1.2:80; |
| } |
| |
| upstream java { |
| server 192.168.1.2:8080; |
| } |
| |
| server { |
| listen 80; |
| |
| location / { |
| root /soft/code; |
| index index.html; |
| } |
| |
| location ~.*\.(png|jpg|gif)$ { |
| proxy_pass http://static; |
| include proxy_params; |
| } |
| |
| location ~.*\.jsp$ { |
| proxy_pass http://java; |
| include proxy_params; |
| } |
| } |
| $ nginx -t |
| $ systemctl start nginx |
3.1.6 访问测试


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律