基于Nginx实现反向代理
qinsz 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
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
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”