事情起因

早期来访过我网站的应该知道我网站是要带端口访问的,也就是你访问nekopara.uk,会解析到cloudflare并且跳转到https://www.nekopara.uk:3939。好巧不巧,隔壁友连的站长告诉我华为云给白嫖1000块!我十分吃惊,并且抱着试一试的心态,哎,你别说,真白嫖到了,然后干了个最低配的云服务器,用来转发请求。实现去掉端口访问。

准备工作:安装HAProxy

在此之前还有一个前置任务,就是在安全组放行443端口,此处不过多展开。
安装HAProxy在Debian系统中并不难,以下命令一键安装:

apt install haproxy

配置HAProxy

HAProxy的配置文件位于/etc/haproxy/haproxy.cfg,可以使用nano进行编辑:

nano /etc/haproxy/haproxy.cfg

什么?nano未找到,自己去装啊!
以下是我haproxy.cfg配置文件的示例:

#---------------------------------------------------------------------
# 全局设定部分
#---------------------------------------------------------------------
global
 
defaults
    log                     global
    option                  dontlognull
    option http-server-close
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# 定义DNS解析器
#---------------------------------------------------------------------
resolvers dns1
    nameserver internal-dns 1.1.1.1:53
    resolve_retries 3
    timeout resolve 10s
    timeout retry 10s
    hold other 30s
    hold refused 30s
    hold nx 30s
    hold timeout 30s
    hold valid 10s
    hold obsolete 30s

#---------------------------------------------------------------------
# 接管HTTP流量实现302跳转HTTPS
#---------------------------------------------------------------------
frontend http
    bind :80 accept-proxy
    mode http

    redirect scheme https code 302 if { hdr(Host) -i www.nekopara.uk } !{ ssl_fc }
 
#---------------------------------------------------------------------
# 通过SNI Proxy对HTTPS流量实现四层转发
#---------------------------------------------------------------------
frontend https_proxy
    mode tcp
    bind :443
    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }

    acl is_www.nekopara.uk req_ssl_sni -i www.nekopara.uk
    use_backend www.nekopara.uk if is_www.nekopara.uk


backend www.nekopara.uk
    mode tcp
    server  ddns-1 org.nekopara.uk:3939 resolvers dns1 resolve-prefer ipv4 send-proxy

保存文件,开启HAProxy:

systemctl enable --now haproxy

解析域名到服务器的IP

在域名控制台添加一个A记录指向服务器的ip地址。
然后你就会发现你网站无法访问了
别急,接下来要改一下源服务器的配置。

修改源服务器的Apache配置文件

打开配置文件,加上RemoteIPProxyProtocol On这一参数。但是要注意,加上这个参数后,直接访问源服务器就会出错了。反正我就加在ServerName ServerAlias这两个参数后面。
重启apache:

systemctl restart httpd

然后就可以看到效果了。