Nginx反向代理实例
1.HTTPS默认端口
监听 443 端口(HTTPS 的标准端口),并配置 SSL 证书。
|
|
这个 Nginx 配置块定义了一个服务器的设置,特别是针对通过 HTTPS 协议访问的 www.xxxxx.com
域名。以下是每一行配置的具体含义:
-
server { ... }
: 这是 Nginx 配置中的一个服务器块,用于定义一组特定的配置指令。 -
listen 443 ssl;
: 这一行指示 Nginx 在 443 端口上监听传入的 HTTPS 请求。ssl
表示启用 SSL/TLS 加密。 -
server_name www.xxxxx.com;
: 指定服务器块应响应的域名。在这个例子中,它指定为www.xxxxx.com
。 -
ssl_certificate /root/ssl/www.xxxxx.com.pem;
: 指定 SSL 证书文件的路径。SSL 证书用于在 SSL/TLS 握手期间与客户端建立加密连接。 -
ssl_certificate_key /root/ssl/www.xxxxx.com.key;
: 指定 SSL 证书的私钥文件路径。私钥是证书的保密部分,用于解密客户端的加密数据。 -
ssl_session_cache shared:SSL:1m;
: 设置 SSL 会话缓存,这有助于重用 SSL 会话参数,从而提高性能。1m
表示缓存大小为 1MB。 -
ssl_session_timeout 5m;
: 设置 SSL 会话的超时时间。在这个例子中,会话信息将被保存 5 分钟。 -
ssl_ciphers HIGH:!aNULL:!MD5;
: 定义服务器接受的 SSL 密码套件列表。HIGH
表示只使用高安全性的密码套件,!aNULL
排除匿名密码套件,!MD5
排除使用 MD5 哈希算法的密码套件。 -
ssl_prefer_server_ciphers on;
: 指示 Nginx 优先使用服务器指定的密码套件,而不是客户端提议的密码套件。 -
location / { ... }
: 定义根 URL(/
)的请求如何处理。 -
root /www/your_project;
: 指定请求的文件根目录。在这个例子中,Nginx 会从/www/your_project
目录提供文件。 -
index index.html index.htm;
: 定义当请求的 URL 没有指定文件名时,Nginx 应该尝试提供哪些文件作为索引文件。首先尝试index.html
,如果不存在,则尝试index.htm
。
总的来说,这个配置块为 www.xxxxx.com
域名设置了 HTTPS 服务,指定了 SSL 证书和密钥,配置了 SSL 会话缓存和密码套件,并且定义了网站内容的根目录和索引文件。
上面这样设置之后,可以直接访问:https://www.xxxxx.com
,这是一个设置了 SSL 证书的 HTTPS 网站。
2.HTTPS非默认端口
如果我们希望网站是 HTTPS 协议,但不是默认的443
端口,比如:2323
端口。
可以直接把上面监听的端口改为2323
,即:listen 443 ssl
改为listen 2323 ssl
,其余的配置和上面的一样即可。
3.设置前缀域名
假设我们已经设置了:https://www.xxxxx.com
,配置参考:HTTPS默认端口。
现在我们希望设置一个前缀域名,如:https://blog.xxxxx.com
,可以监听443端口,并对该前缀域名进行反向代理,如下:
|
|
在 Nginx 配置中,server_name
和 listen
字段共同定义了一个服务器块(server block),用于处理特定的请求。理想情况下,每个服务器块都应该有一个唯一的组合,以避免混淆和潜在的配置冲突。
listen
字段:listen
指令指定了服务器应该监听的网络接口和端口。例如,listen 443 ssl;
表示服务器将监听 443 端口上的 HTTPS 请求。如果你有多个服务器块监听同一个端口,但服务于不同的域名或路径,这是可以的,因为 server_name
将用于区分它们。
server_name
字段:server_name
指令定义了服务器块应响应的域名。如果你有多个服务器块使用相同的 server_name
,但配置了不同的 listen
端口,这也是可以的,因为 Nginx 会根据端口和域名的组合来决定使用哪个服务器块。
【注意】要使前缀域名的域名解析生效,还需要在域名的云解析处,将该前缀域名解析到自己的服务器中。
如:添加一条A记录,主机记录为:blog.xxxxx.com,记录值为云服务器的地址。
4.将多个web应用集成到同一个域名解析中
比如我们现在已经有一个网站:https://www.xxxxx.com
,我们现在又在8888
端口开了一个web服务用于文件的上传,我们希望直接访问https://www.xxxxx.com/upload
,就可以访问文件上传服务,而不是:http://172.32.61.432:8888/upload
(172.32.61.432
为云服务器地址)。
我们可以对URL
的请求路径进行处理,将/upload
路径反向代理到本机的8888
端口。
具体如下:
|
|
location /upload { ... }
: 定义了当请求的 URL 路径为/upload
时如何处理请求。proxy_pass http://172.32.61.432:8888;
: 指定了请求将被代理到的后端服务器。在这个例子中,所有/upload
路径的请求都会被转发到 IP 地址172.32.61.432
的 8888 端口。proxy_set_header Host $host;
: 设置代理请求的Host
头部,使用原始请求中的Host
值。proxy_set_header X-Real-IP $remote_addr;
: 设置X-Real-IP
头部,使用客户端的 IP 地址。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
: 设置X-Forwarded-For
头部,用于传递原始请求的客户端 IP 地址。$proxy_add_x_forwarded_for
是一个内置变量,用于添加X-Forwarded-For
头部。proxy_set_header X-Forwarded-Proto $scheme;
: 设置X-Forwarded-Proto
头部,指示原始请求使用的是 HTTP 还是 HTTPS。proxy_set_header Request-Uri $request_uri;
: 设置Request-Uri
头部,包含原始请求的 URI。
这个配置使得 Nginx 能够处理对 www.xxxxx.com
域名的 HTTPS 请求,并将 /upload
路径的请求代理到指定的后端服务器。
【问题】上面这样反向代理之后存在的问题:
当访问http://172.32.61.432:8888/upload
上传文件时,前端页面上的上传进度条走完之后,就会马上返回“上传成功”,但如果访问https://www.xxxxx.com/upload
上传文件,在前端页面上的上传进度条走完之后,会等一段时间才会返回“上传成功”,这是什么原因导致的呢?
(2024.03.13 目前对于这个问题是存疑的)
猜想可能的原因:
-
第一个是HTTP请求,而第二个是HTTPS请求,可能需要进行额外的 SSL 解密和加密操作,所以需要更多的时间。
-
两个请求的端口不一样,在中间转发时需要一定的时间。