基于Nginx实现反向代理

4/12/2024 ubuntunginxproxy

# 一、场景

利用nginx将请求转发到指定地址
1

# 二、实现

# 1. 基本配置

下面以一个支持ssl功能的配置为例: 在/etc/nginx/conf.d/路径下创建一个以.conf结尾的文件,文件内容如下:

server {
    listen 443 ssl;
    
    # 与server_name相符的请求,将交由本server模块处理
    server_name api.myserver.com;
    
    # 本server的连接日志文件地址
    access_log /etc/nginx/conf.d/api_access.log;
    
    # 与域名api.myserver.com匹配的ssl证书文件路径
    ssl_certificate /home/one/ssl_certification/api.myserver.com.pem;
    ssl_certificate_key /home/one/ssl_certification/api.myserver.com.key;
    
    # 一些增强安全性的ssl配置(非必须)
    
    # SSL/TLS会话的超时时间。超过这个时间后,需要重新协商安全参数。
    # SSL/TLS握手是资源密集型过程,频繁握手会增加CPU消耗和延迟
    ssl_session_timeout 5m;
    
    # 指定服务器接受的加密套件列表。如果ssl证书使用的加密算法不满足套件列表的要求,那么则会握手失败。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    
    # 是否应优先考虑服务器的密码套件偏好而不是客户端的。
    ssl_prefer_server_ciphers on;
    
    # 指定服务器支持的 SSL/TLS 协议版本
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    
    location / {
        # 指定转发的地址及端口
        proxy_pass http://localhost:8001/;
        
        # 转发时设置header中的Host字段,填入原请求的host值
        proxy_set_header Host $host;
        
        # 转发时设置header中的X-Real-IP字段,填入请求客户端的实际地址
        proxy_set_header X-Real-IP $remote_addr;
        
        # 转发时设置header中的X-Forwarded-For字段, 填入原始请求的 IP 地址及其前面的所有代理的IP地址
        # 应对多层代理的情况,用于追踪请求的原始来源
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 转发时设置header中的X-Forwarded-Proto字段,填入原始请求所使用的协议(如 http 或 https)
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# 2. 代理多个应用程序

假设只有1个用于api的ssl证书,但需要代理多个应用程序,可通过路由匹配来实现,配置如下:

server {

    ...配置内容同“1”中的一样...
    
    # app1监听8001端口
    location /app1/ {
        proxy_pass http://localhost:8001/;
        ...其它配置同“1”中一样...
    }
    
    # app2监听8002端口
    location /app2/ {
        proxy_pass http://localhost:8002;
        ...其它配置同“1”中一样...
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • 通过上述配置,根据不同的路由则会转发到不同的端口上
  • proxy_pass后的地址如果以“/”,那么转发时,就会去掉location中的部分。
    如请求“api.myserver.com/app1/user-info”经过上述配置转发,app1收到的URI则会是“/user-info”
  • proxy_pass后的地址如果没有以“/”,那么转发时则会转发原始的URI
    如请求“api.myserver.com/app2/user-info”经过上述配置转发,app2收到的URI则会是“/app2/user-info”
Last Updated: 4/12/2024, 4:17:19 PM