Nginx反向代理实例

1.HTTPS默认端口

监听 443 端口(HTTPS 的标准端口),并配置 SSL 证书。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server {
	listen 443 ssl;
	server_name www.xxxxx.com;

	ssl_certificate /root/ssl/www.xxxxx.com.pem;
	ssl_certificate_key /root/ssl/www.xxxxx.com.key;

	ssl_session_cache    shared:SSL:1m;
	ssl_session_timeout  5m;
	ssl_ciphers  HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers  on;

	location / {
	    root   /www/your_project;
		index  index.html index.htm;
    }
}
逐行解释

这个 Nginx 配置块定义了一个服务器的设置,特别是针对通过 HTTPS 协议访问的 www.xxxxx.com 域名。以下是每一行配置的具体含义:

  1. server { ... }: 这是 Nginx 配置中的一个服务器块,用于定义一组特定的配置指令。

  2. listen 443 ssl;: 这一行指示 Nginx 在 443 端口上监听传入的 HTTPS 请求。ssl 表示启用 SSL/TLS 加密。

  3. server_name www.xxxxx.com;: 指定服务器块应响应的域名。在这个例子中,它指定为 www.xxxxx.com

  4. ssl_certificate /root/ssl/www.xxxxx.com.pem;: 指定 SSL 证书文件的路径。SSL 证书用于在 SSL/TLS 握手期间与客户端建立加密连接。

  5. ssl_certificate_key /root/ssl/www.xxxxx.com.key;: 指定 SSL 证书的私钥文件路径。私钥是证书的保密部分,用于解密客户端的加密数据。

  6. ssl_session_cache shared:SSL:1m;: 设置 SSL 会话缓存,这有助于重用 SSL 会话参数,从而提高性能。1m 表示缓存大小为 1MB。

  7. ssl_session_timeout 5m;: 设置 SSL 会话的超时时间。在这个例子中,会话信息将被保存 5 分钟。

  8. ssl_ciphers HIGH:!aNULL:!MD5;: 定义服务器接受的 SSL 密码套件列表。HIGH 表示只使用高安全性的密码套件,!aNULL 排除匿名密码套件,!MD5 排除使用 MD5 哈希算法的密码套件。

  9. ssl_prefer_server_ciphers on;: 指示 Nginx 优先使用服务器指定的密码套件,而不是客户端提议的密码套件。

  10. location / { ... }: 定义根 URL(/)的请求如何处理。

  11. root /www/your_project;: 指定请求的文件根目录。在这个例子中,Nginx 会从 /www/your_project 目录提供文件。

  12. 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端口,并对该前缀域名进行反向代理,如下:

1
2
3
4
5
6
7
server {
    listen 443 ssl;
    server_name https://blog.xxxxx.com;

    # 其他配置同上
    # ......
}

在 Nginx 配置中,server_namelisten 字段共同定义了一个服务器块(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/upload172.32.61.432为云服务器地址)。

我们可以对URL的请求路径进行处理,将/upload路径反向代理到本机的8888端口。

具体如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
	listen 443 ssl;
	server_name www.xxxxx.com;

	ssl_certificate /root/ssl/www.xxxxx.com.pem;
	ssl_certificate_key /root/ssl/www.xxxxx.com.key;

    location / {
        root   /www/your_project;
		index  index.html index.htm;
	}
    
    location /upload {
        proxy_pass http://172.32.61.432:8888;
        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_set_header Request-Uri $request_uri;
	}
}
逐行解释
  1. location /upload { ... }: 定义了当请求的 URL 路径为 /upload 时如何处理请求。
  2. proxy_pass http://172.32.61.432:8888;: 指定了请求将被代理到的后端服务器。在这个例子中,所有 /upload 路径的请求都会被转发到 IP 地址 172.32.61.432 的 8888 端口。
  3. proxy_set_header Host $host;: 设置代理请求的 Host 头部,使用原始请求中的 Host 值。
  4. proxy_set_header X-Real-IP $remote_addr;: 设置 X-Real-IP 头部,使用客户端的 IP 地址。
  5. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;: 设置 X-Forwarded-For 头部,用于传递原始请求的客户端 IP 地址。$proxy_add_x_forwarded_for 是一个内置变量,用于添加 X-Forwarded-For 头部。
  6. proxy_set_header X-Forwarded-Proto $scheme;: 设置 X-Forwarded-Proto 头部,指示原始请求使用的是 HTTP 还是 HTTPS。
  7. 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 解密和加密操作,所以需要更多的时间。

  • 两个请求的端口不一样,在中间转发时需要一定的时间。

0%