Web 服务器(SSL、反向代理)

时隔两年的更新,终于来了。避免被喷,还是说下本人前端,对服务器只是有点兴趣,了解的很浅很浅,求大佬轻喷。这期讲讲用到的 web 服务器配置。


最近有需要对 web 服务器进行改造,具体的需求见下方。正好顺便了解下目前两大主流 web 服务器的一些配置。

需求:根据数据表的记录,判断链接是否过期,如果已过期则显示过期页面,如果未过期直接显示页面内容。

解决方案:基于 nodejs,搭建一个简易的 http 服务器(基于 http 库)。


由于之前一直使用宝塔面板对服务器进行管理(又听说配置很多又记不住),所以一直不太了解 web 服务器配置。最近在迁移服务器的时候又遇到了一些问题,正好趁这个机会了解了一些配置项目。

SSL:以宝塔生成的配置文件为例,关于证书还有一些话想说,正好作为下一篇帖子的内容(挖坑)。

listen 443 ssl http2;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    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;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;
#SSL-END

其中 ssl_protocols 之后的配置可能要根据证书填写,之前也在腾讯云申请过免费的证书,腾讯云提供的部署指南中关于协议加密套件和宝塔有写不同,应该是根据证书填写,但是我这么填进去也能用,具体之后再仔细研究。

反向代理:以宝塔生成的配置文件为例

不知道各位有没有这样的情况:写的接口跑在非 80 端口上,直接用 ip + 端口号访问一来是比较 low,二来配置 https 会有些麻烦,还需要导入证书进行配置才行。比如写了一个接口是 192.168.124.1:6666/ 这样访问的,用上反向代理之后,可以使用目录代理的方式,用 192.168.124.1/api/ 进行访问。只需要加上几条配置文件就可以。

#PROXY-START/music

location ^~ /music/
{
    proxy_pass http://127.0.0.1:3000/;
    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 REMOTE-HOST $remote_addr;

    add_header X-Cache $upstream_cache_status;
	#Set Nginx Cache

    if ( $uri ~* ".(gif|png|jpg|css|js|woff|woff2)$" )
    {
    }
    proxy_ignore_headers Set-Cookie Cache-Control expires;
    proxy_cache cache_one;
    proxy_cache_key $host$uri$is_args$args;
    proxy_cache_valid 200 304 301 302 1m;
}

#PROXY-END/music

上面这一段配置文件就是将本机 3000 端口的服务使用 /music 目录反向代理(有 Cache 字眼的是缓存相关的配置,可以不配)。不仅具有以上的好处,而且还不需要开放外网端口(又安全又省事),这样访问也更加优雅。

上面这段配置文件是代理 HTTP 协议的,WS 协议也是可以代理的。

#PROXY-START/ws/

location ^~ /ws/
{
    proxy_pass https://127.0.0.1:23333/;
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_connect_timeout 3s;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;

    add_header X-Cache $upstream_cache_status;
    #Set Nginx Cache
    set $static_filePwNR71yt 0;
    if ( $uri ~* ".(gif|png|jpg|css|js|woff|woff2)$" )
    {
        set $static_filePwNR71yt 1;
        expires 12h;
        }
    if ( $static_filePwNR71yt = 0 )
    {
    add_header Cache-Control no-cache;
    }
}

#PROXY-END/ws/

这段配置文件长一点,但其实只是多出了两句协议升级的配置(加粗的内容,带有 Upgrade 字眼),ws 协议其实是 HTTP 升级而来的。这是将 23333 端口代理到 /ws 目录下,这样访问就很方便了。

但是 ws 协议使用反向代理目前也遇到了超时断开的问题,这里将超时时间设置到了一小时先这样试用一下。解决这个超时问题的办法目前看到的就是定时发送心跳包(在超时时间内),这样就可以保持连接。之后再找找其他办法,或者加入心跳的机制。


一些有帮助的帖子

  • https://blog.csdn.net/wd520521/article/details/124681857
  • https://blog.csdn.net/tsqjxy/article/details/125673308
  • https://www.pianshen.com/article/17741008773/

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注