本文最后更新于 2024-07-06,文章内容可能已经过时。

有的时候因为众所周知的原因,无法使用常规端口来完成项目建设。

当使用非标准端口来完成建站的时候,通常无法像默认端口一样完成无感的 HTTP -> HTTPS 的跳转,通常可能是进行使用两个非标准端口进行跳转,例如: http://127.0.0.1:8888 -> https://127.0.0.1:8899 ,其实也可以通过 Nginx 自带的功能完成 HTTP/HTTPS 在用户侧体现成一个端口,达到无感跳转。

1708165690873.png

这种做法可能在对付某些特定情况下的项目升级迭代流程也会起到作用。

  1. 先添加一个 stream 模块,可以直接在 nginx.conf 总配置文件中添加就好了。
stream {
    # 定义一个upstream,这里是HTTP协议的
    upstream web {
        server 127.0.0.1:80;
    }

    # 定义一个upstream,这里是HTTPS协议的
    upstream https {
        server 127.0.0.1:443;
    }

    # 定义一个映射关系,根据ssl/tls信息走到不同的upstream
    map $ssl_preread_protocol $upstream {
        ""      web;
        default https;
    }

    # 监听一下8888端口,这个就是我们暴露出去的非标准端口,根据上面定义的映射信息代理流量
    server {
        listen      8888;
        proxy_pass  $upstream;
        ssl_preread on;
    }
}
  1. 一个示例的Nginx站点配置,可以看到就是常规的标准端口的配置文件。
server {
    listen                    80;
    listen                    [::]:80;
    listen                    443 ssl http2;
    listen                    [::]:443 ssl http2;
    charset                   utf-8,gbk;
    server_name               home.zhx47.top;
    
    ssl_certificate           /root/.acme.sh/zhx47.top_ecc/fullchain.cer;
    ssl_certificate_key       /root/.acme.sh/zhx47.top_ecc/zhx47.top.key;
    ssl_protocols             TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_buffer_size           1400;
    ssl_session_cache         builtin:1000 shared:SSL:10m;
    ssl_session_timeout       10m;
    ssl_stapling_verify       on;
    ssl_prefer_server_ciphers on;
    ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    
    add_header                Strict-Transport-Security max-age=15768000;
    
    if ($ssl_protocol = "") { return 301 https://$http_host$request_uri; }
    
    location / {
        proxy_pass       http://127.0.0.1:40000;
        proxy_set_header Host              $http_host;
        proxy_set_header Scheme            $scheme;
        proxy_set_header Upgrade           $http_upgrade;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header Connection        $connection_upgrade;
        proxy_set_header SERVER_PORT       $server_port;
        proxy_set_header REMOTE_ADDR       $remote_addr;
        proxy_set_header X-Real-Proto      $scheme;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

到这里,我们直接访问 8888 端口,就可以完成用户侧无感的 HTTP -> HTTPS 跳转,同时如果后续备案成功后,也可以直接通过 80/443 常规端口进行访问。