使用nginx作为xui前置代理,解决统一443端口通信

背景

在不久之前我曾写过一篇文章 《解决V2ray不能同时监听IPv4和IPv6的问题》 ,其中解决的方法就是在前置加Nginx代理,因为Nginx在支持IPv6的环境中没有该问题。

我个人的甲骨文云上的VPS使用的是 X-UI , 在此之前我是习惯于自己手写 config.json 文件。但是手写配置文件确实也不太方便管理,尤其是在多个入站的情况下...,你懂的...

当我使用 X-UI 后,开了多个入站的时候,上照之前的文章中的那种做也太麻烦了点。 X-UI 里增加了一个入站,Nginx的配置文件又需要改,而且Nginx的配置文件最后会被改的又臭又长,对后期的维护非常不友好。

故发此文,对上述作改进

我简单的说下原理:

为了减少个性化配置,最可性的办法就是把端口改成动态的。那么这个端口号的变量只能写在客户端了,当然客户端本来就要写很多个性化的配置,多一个端口号也不重要。

那么如何把客户端配置的信息传到Nginx里来呢?

可以有多种办法:

  • Header
  • request uri

我这里采用的就是第二种 request uri, 在Client的配置的 path 里增加一个 get 变量

Nginx 的配置

 1upstream xui-backend {
 2    server [::1]:54321;
 3}
 4server {
 5    listen 443 ssl http2;
 6    keepalive_timeout 3m;
 7    server_name fk.fk.com; # 换成自己的server name
 8    # charset UTF-8;
 9	proxy_read_timeout 600;
10	proxy_send_timeout 600;
11	proxy_connect_timeout 600;
12    client_max_body_size 30m;
13
14    ssl_certificate /home/user/ssl/fk.cer;
15    ssl_certificate_key /home/user/ssl/fk.key;
16
17    ssl_prefer_server_ciphers on;
18    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
19    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
20	ssl_session_timeout 3m;
21
22    root /home/user/www;
23    index index.html index.htm;
24
25    location /fk {
26    	proxy_redirect off;
27        proxy_http_version 1.1;
28        proxy_set_header 	Upgrade				$http_upgrade;
29        proxy_set_header	Connection 			"upgrade";
30        proxy_set_header    Host                $http_host;
31        proxy_set_header    X-Real-IP           $remote_addr;
32        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
33        proxy_set_header    X-Forwarded-Proto   $scheme;
34        proxy_pass http://[::1]:$arg_vp/fk;
35    }
36	location / {
37        allow 127.0.0.1;
38        deny all;
39        proxy_redirect off;
40
41        client_max_body_size 0;
42        gzip on;
43        proxy_http_version 1.1;
44
45        proxy_set_header    Host                $http_host;
46        proxy_set_header    X-Real-IP           $remote_addr;
47        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
48        proxy_set_header    X-Forwarded-Proto   $scheme;
49        proxy_set_header    Upgrade             $http_upgrade;
50        proxy_pass http://xui-backend;
51    }
52    access_log /var/log/nginx/fk.com.log access;
53}

proxy_pass http://[::1]:$arg_vp/fk; 中的 $arg_vp 就是 $request_uri 中的 vp 参数,具体的下面 v2ray client 配置文件中有介绍

V2ray Client 的配置

这里截取了一 outbounds 的配置片段

 1"outbounds": [
 2      {
 3        "protocol": "vless",
 4        "settings": {
 5          "vnext": [
 6            {
 7              "address": "fk.fk.com",
 8              "port": 443,
 9              "users": [
10                {
11                  "encryption": "none",
12                  "flow": "",
13                  "id": "c6ac9c9b-6f38-4100-fef0-*******",
14                  "level": 8,
15                  "security": "auto"
16                }
17              ]
18            }
19          ]
20        },
21        "streamSettings": {
22          "network": "ws",
23          "security": "tls",
24          "tlsSettings": {
25            "allowInsecure": false,
26            "fingerprint": "",
27            "serverName": "fk.fk.com"
28          },
29          "wsSettings": {
30            "headers": {
31              "Host": "fk.fk.com"
32            },
33            "path": "/fk?vp=8802"
34          }
35        },
36      },

在这个配置文件中 "path": "/fk?vp=8802"8802 就是你入站所开的端口。这样改过之后,再也就没有那些烦人的修改好多配置文件的麻烦了,如果你有加防火墙,这样改更省事...