这个站点的访问是开启了强制 HTTPS 连接的,不过另一个文档站则没有,因为之前一直没有尝试过如何在 nginx 反代处加入对后端服务的 HTTPS 支持。
查了一下资料,其实比较简单。首先当然是在 nginx 的反代配置中,像正常的站点一般加入该有的内容,主要就是 chained crt 和 key 两个文件。如果跟我一样,在使用免费的 let’s encrypt 证书,这两个文件是在申请过程中自动生成的。
生成过程中有一个地方需要特殊处理,那就是对 ACME Challenge 的响应。因为验证是要请求站点下的 /.well-known/acme-challenge
,而后端被代理的服务通常都不会处理这个,那就也必须把这个处理放到 nginx 配置中来。解决方案是把此路径配置到 80 侦听的 server 块中,如下:
1 2 3 4 5 6 7 8 |
location ^~ /.well-known/acme-challenge/ { default_type "text/plain"; allow all; root /var/www/example.com/; } location / { return 301 https://$host$request_uri; } |
当然了,其中的 root
要根据你的具体情况自己改成合适的路径。
在 443 侦听的 server 块中,则要在 proxy_pass
前确保请求头进行了妥善的设置(尤其是 scheme):
1 2 3 4 |
proxy_set_header X-Forwarded-For $remote_addr; # proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; |