MENU

在VPS上复用80/443端口运作多个机场节点并建站

January 25, 2021 • 日志

前言

尽管很多时候,我们学生党购买VPS都是为了搭建机场节点来当作业余爱好(玩具),但是难免会遇到很贵的VPS。虽然线路很不错,但是一个人买总显得有些入不敷出,此时我们可以召集小伙伴们来合买,从而就有了这篇文章...

在不考虑端口的复用情况下,如果需要建站,那么80443端口必定会被占用(别和我说建站你不开启TLS哦,那样是会影响你网站SEO的)。这里以Soga后端为例,我们就必须创建额外多个端口来满足各个小伙伴们机场的入口端,比如1880、8080之类,但是在外界看起来,用户访问节点就是在不断访问ws://$your_hostname:8080/一样的奇怪,会被墙盯住干扰出现断流不说,在ISP里看来,这种流量的意义价值也并不高,像极了代理,会给予更低的优先级,从而出现体验更差的情况。

准备工作

既然我们知道了问题的原因,这就好办了——我们只需要让所有的节点入口看起来都是从80端口访问的,那么看起来就更像是在访问真实的网页,甚至可以直接在上面用80端口建个站,看起来更加逼真。

问题来了,假设这台VPS要对接2个机场的后端,并且上面还要建个站,80端口实际上后面对应的是3个服务,怎么区分此时客户端想访问的是哪个服务,我们可以使用客户端访问时在http包中包含的域名(host)来做区分。

这其实是一种非常特殊的反向代理,我相信你听到这个词就知道完全可以用Nginx来解决,这里我必须得提一句,建这种站,本身就是一种心理安慰+伪装的效果,请不要使用宝塔-宝塔的国内版本含有部分第三方闭源插件,且面板本身需要登陆使用(可破解),可能造成隐私的泄露,建议使用其国际版aapanel以取代之。

安装Nginx

Redhat系

在Redhat系(主要是CentOS)的Linux发行版下,我们需要首先导入epel第三方源来引入可以安装Nginx的源,不放心的话你也可以去Nginx官方下载源码包自行编译。

yum install epel-release -y

安装epel源完毕以后,就可以安装Nginx了

yum install nginx -y

安装完毕以后,我们最好能设置开机自启,方便以后VPS商家莫名其妙维护然后导致的Nginx重启后需要手动启动的问题。这里我们需要用到systemctl这个工具来帮助我们管理Nginx的服务启动,但是在这之前,我们需要关闭SElinux内核,将其从enforcing模式调整为disabled,否则使用Systemctl启动会报错导致失败。

先检查一下selinux的运作状态 getenforce,如果返回提示Disabled,则无需进行接下来的操作。

vi /etc/selinux/conf,看到配置文件被打开以后,轻巧键盘i进入vim的编辑模式,键盘把光标挪至那一行,然后将enforcing删除,并替换为disabled,按下键盘Esc,在确保英文模式(半角)下输入:wq(保存并退出文件),配置文件需要下次系统启动才会生效,所以我们需要现在就将SElinux关闭,setenforce 0

当然,这儿有懒人包,使用Linux强大的sed命令使用正则匹配一键替换并关闭SElinux sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0(快夸我)

Debian系

对于Debian和Ubuntu来说可就简单多了,一行命令解决

sudo apt-get update && sudo apt-get install nginx -y

开启systemctl对于Nginx的服务之前,我们需要首先杀掉Nginx在安装时自启的进程,否则会导致冲突,pkill nginx,然后启动服务,systemctl enable nginx && systemctl start nginx,接下来查看服务是否正常启动,systemctl status nginx,如果不出意外,你的Nginx现在也已经正常运行。

配置Nginx

Nginx的默认配置文件在/etc/nginx/nginx.conf中,我们可以用cat /etc/nginx/nginx.conf先看一下里面的默认的内容,一般是这样的:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

我们需要把它改成这样,具体的解释已经在每行配置文件后做了解释

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

      server {
  
        listen       80 default_server; # 默认站点,即你直接使用IP访问的时候,Nginx会向这个服务请求
        listen       [::]:80 default_server; # IPV6监听,默认IPV6 IP访问会转发到这里,如果机器有的话可用打开
        #listen 443 ssl http2; # 如果需要配置HTTPS加密,请在此设置,然后将“#”删掉
        server_name  访客访问网站将用的域名;
        #ssl_certificate 你的证书路径;
        #ssl_certificate_key 你的证书密钥路径;
        #下面放着不要动即可
        #ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        #ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        #ssl_prefer_server_ciphers on;
        #ssl_session_cache shared:SSL:10m;
        #ssl_session_timeout 10m;
        root         /usr/share/nginx/html; # 放网站的位置,请把index.html放到这里面
        index index.html index.htm default.htm default.html; # Nginx判断目录中是否存在首页文件的依据
    }

    server {
        # 这里也可以配置wss(tls),根据上面的写法自行抄下来
        listen       80; # 非默认服务,需要客户端请求特定域名才会将客户端的请求转发至此
        listen       [::]:80; # IPV6,同上
        server_name  第一个机场访问的域名;
                        
        location / {
                        proxy_redirect off;
                        proxy_pass http://localhost:8080; # Nginx将这个请求转发到第一个机场的后端实际监听的端口
                        proxy_set_header X-Real_IP $remote_addr;
                        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
                        proxy_http_version 1.1;
                        proxy_set_header Upgrade $http_upgrade; # 升级协议头
                        proxy_set_header Connection upgrade;
        }

      }
    
      server {
        # 这里也可以配置wss(tls),根据上面的写法自行抄下来
        listen       80; # 非默认服务,需要客户端请求特定域名才会将客户端的请求转发至此
        listen       [::]:80; # 同上
        server_name  第二个机场访问将用的域名;
        #root         /usr/share/nginx/html;
                        
        location / {
                        proxy_redirect off;
                        proxy_pass http://localhost:8089; # Nginx将这个请求转发到第二个机场的后端实际监听的端口
                        proxy_set_header X-Real_IP $remote_addr;
                        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
                        proxy_http_version 1.1;
                        proxy_set_header Upgrade $http_upgrade; # 升级协议头
                        proxy_set_header Connection upgrade;
        }
    }
}

如果要部署多个网站,多个后端也请如法炮制,但是必须注意的是,default_server只能有一个,如果配置多个Nginx会报错,每次修改完配置文件以后运行nginx -s reload即生效配置文件。

最后

一个高价VPS最终在多个小伙伴的全力支持下变成了平民鸡,上面装满了各种各样的Docker镜像+网站后端,超高利用率,真香!

Last Modified: May 5, 2021
Leave a Comment

2 Comments
  1. Jasmine Jasmine

    你好!关于你的NETFLIX-VERIFY半解锁检测。我遇到了Netflix半解锁的情况,可以向你提供一些关于我的情况的信息。
    服务器:GCP香港,AWS北加利福尼亚。无排行榜,只能解锁部分自制剧,目前发现无法解锁的自制剧为(包括但不限于):Black Mirror S1-S5,Enola Holmes,Better Call Saul。

    1. @Jasmine您好,半解锁的含义是没有排行榜,但是却可以解锁部分非自制剧。
      您这种情况属于只解锁部分自制剧哦,适用于NetFlix版权限制更为严格的情况,常出现于Vultr、Linode、AWS、GCP、Azure上。