最近在做web3的创业项目,需要给第三方提供API接口需要配置二级域名:整个过程遇到了一系列问题都一一解决了,记录下整个过程:
二级域名是可以不开启HTTPS的,直接用HTTP也行,开启HTTPS后配置会繁琐些,但不算太复杂。一个SSL证书只能对应一个域名,所以要为二级域名申请一个证书,有免费的申请网站:FreeSSL首页 - FreeSSL.cn一个提供免费HTTPS证书申请的网站
1、先在域名服务商哪里配置解析,也就是添加主机记录(A),IP地址和一级域名的一样,端口也一样,我的是在Godaddy上买的,解析配置如下:
添加完后,域名服务商这边就好了,接下就去申请证书,申请证书也需要在域名服务商这边在填写一遍cname的验证,这个验证是SSL证书服务商那边验证这个域名是不是你所有,具体教程如下:ACME v2证书自动化快速入门,这个是可以自动续期的。
ACME v2证书自动化快速入门
1.安装acme.sh
建议切换到root模式,可以减少证书安装时的问题sudo su
注意:MacOS 不用切换到root更简单。
curl https://get.acme.sh | sh -s email=my@example.com
如果上面官方下载地址失败 或者 太慢,可以选用国内的备用地址
curl https://gitcode.net/cert/cn-acme.sh/-/raw/master/install.sh?inline=false | sh -s email=my@example.com
注意:安装完成后,再重新打开命令行(如果是 SSH,选择重新连接),以使acme.sh命令生效。
或者执行刷新
source ~/.bashrc
2.对域名进行授权
输入域名
获得域名验证(DCV)授权信息
到您的域名解析服务商添加解析记录,下面以DNSPod为例:
3.证书申请 & 部署
点击【配置完成,立即检测】后获得证书申请命令
部署到 WebServer
Apache example:
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
Nginx example:
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
享受自动续期吧!证书进入到30天有效期,acme.sh 会自动完成续期。
下面就可以配置NGINX的二级域名解析了,配置和一级域名的一样,只是多了代理和SSL。前面只是讲解当前一级域名https的请求。根据http二级域名经验,进行制作二级https二级域名。都是一样的,只要后面新增一个新的,然后再代理上新的就好了(注意:一定是在第一个server的后面新增server)完整核心的NGINX配置如下:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;#前端项目根目录
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
rewrite ^(.*)$ https://$host$1 permanent; #用于将http页面重定向到https页面
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri.html $uri/ /index.html;#这里是next.js的多页面访问配置,解决404错误
}
}
server {
listen 80;
server_name metadata.tnafcs.com;#这里很重要二级域名配置
rewrite ^(.*)$ https://$host$1 permanent; #用于将http页面重定向到https页面
location / {
proxy_pass http://127.0.0.1:9897;#nodejs后端项目地址端口,开启HTTP强制转HTTPS后直接走HTTPS里的
proxy_buffer_size 64k;
proxy_buffering on;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_max_temp_file_size 1024m;
proxy_ssl_server_name off;
}
}
server {
listen 443 ssl http2;#开启了HTTP2版本,加载速度是HTTP1.1的7倍左右
listen [::]:443 ssl http2;#开启了HTTP2版本,加载速度是HTTP1.1的7倍左右
ssl_certificate /etc/nginx/cert/full_chain.pem;
ssl_certificate_key /etc/nginx/cert/private.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam /etc/nginx/cert/ffdhe2048.txt;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
root /var/www/html;#前端项目根目录
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri.html $uri/ /index.html;#这里是next.js的多页面访问配置,解决404错误
}
}
server {
listen 443 ssl http2;#开启了HTTP2版本,加载速度是HTTP1.1的7倍左右
listen [::]:443 ssl http2;#开启了HTTP2版本,加载速度是HTTP1.1的7倍左右
server_name metadata.etherfair.space;#这里很重要,二级域名配置
ssl_certificate /root/.acme.sh/metadata.tnafcs.com/metadata.tnafcs.com.cer;
ssl_certificate_key /root/.acme.sh/metadata.tnafcs.com/metadata.tnafcs.com.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
#ssl_dhparam /etc/nginx/cert/ffdhe2048.txt;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
proxy_pass http://metadata.tnafcs.com:9897;#这里很重要,#nodejs后端项目地址端口,开启HTTP强制转HTTPS后直接走HTTPS里的
proxy_buffer_size 64k;
proxy_buffering on;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_max_temp_file_size 1024m;
proxy_ssl_server_name on;
}
}
如果出现502,那是SSL_do_handshake()握手失败,proxy_pass 代理换成http的就可以了。参考这篇文章nginx反向代理网页502、SSL_do_handshake()握手失败_来碗米饭的博客-CSDN博客_ssl_do_handshake
其他的就不啰嗦了,具体可以看以下参考文献:
2、【搭建后台环境】nginx https 配置二级域名 - 掘金
3、NGINX反向代理某些请求出现502 BAD GATEWAY_IT_狂奔者的博客-CSDN博客_nginx反向代理出现502
4、nginx反向代理网页502、SSL_do_handshake()握手失败_来碗米饭的博客-CSDN博客_ssl_do_handshake