使用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
就是你入站所开的端口。这样改过之后,再也就没有那些烦人的修改好多配置文件的麻烦了,如果你有加防火墙,这样改更省事...