视频版:
00.nps配置
因为nginx需要监听80与443端口,而nps的http和https默认代理端口也是80与443端口,所以我们需要修改nps的配置
进入nps的根目录,本人这里是/opt/nps/,但是很多人是/etc/nps
进入conf文件夹,编辑nps.conf文件,找到以下代码块
#HTTP(S) proxy port, no startup if empty
http_proxy_ip=0.0.0.0
http_proxy_port=80
https_proxy_port=443
https_just_proxy=true
将其中的80和443端口改成你想要的就可以了,https可以留空,因为我们直接用nginx强制使用https即可,就不需要https代理了
然后重启nps:
sudo systemctl restart nps
我这里将http代理端口设置为8010,https端口设置为空
01.新建域名解析(如果之前没有)
这里的主机指的是用户访问的地址,也就是用户输入地址栏的地址。只有nps识别到用户从主机一模一样的域名进来,才会给你内网穿透
02.nginx与nps配合的配置
先上配置文件(里面的charsama.cn要改为你自己的域名):
events {
worker_connections 1024;
}
http {
# 1. 主域名的 HTTP 重定向到 HTTPS
server {
listen 80;
server_name charsama.cn;
return 301 https://charsama.cn$request_uri;
}
# 2. 强制将 www.charsama.cn 的 HTTP 重定向到 HTTPS 主域名
server {
listen 80;
server_name www.charsama.cn;
return 301 https://charsama.cn$request_uri;
}
# 3. 强制将 HTTPS 的 www.charsama.cn 重定向到主域名
server {
listen 443 ssl;
server_name www.charsama.cn;
ssl_certificate /etc/nginx/conf.d/charsama.cn/fullchain.pem;
ssl_certificate_key /etc/nginx/conf.d/charsama.cn/privkey.pem;
return 301 https://charsama.cn$request_uri;
}
# 4. 主域名 HTTPS 配置
server {
listen 443 ssl;
server_name charsama.cn;
ssl_certificate /etc/nginx/conf.d/charsama.cn/fullchain.pem;
ssl_certificate_key /etc/nginx/conf.d/charsama.cn/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000";
access_log /var/log/nginx/charsama.cn.https.log;
location / {
proxy_pass http://127.0.0.1:8010;
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 X-Forwarded-Proto $scheme;
}
}
}
前面三个都是用于强制跳转的,效果大概是:
https://charsama.cn -> https://charsama.cn
http://www.charsama.cn -> https://charsama.cn
https://www.charsama.cn -> https://charsama.cn
最后一个server中的proxy_pass http://127.0.0.1:8010;就是将请求发送到nps大的http代理端口,我之前设置的是8010,你们如果设置的是其它端口就设置为proxy_pass http://127.0.0.1:[其它端口];
原理就是,你给nps发送了用户的host,也就是用户访问的主机名,然后nps通过8010端口接收并从域名解析中对比主机名,哪个对上了就内网穿透哪一个
ssl_certificate /etc/nginx/conf.d/charsama.cn/fullchain.pem;
ssl_certificate_key /etc/nginx/conf.d/charsama.cn/privkey.pem;
这两行是证书,我们等会就会去申请
将这些配置修改成你的域名之后,进入nginx根目录
cd /etc/nginx
把上面的所有内容(你修改过后的)全部替换你nginx.conf里面的内容(如果你曾经修改过里面的东西请酌情保留)
03.申请证书
进入 https://httpsok.com/ 网页(如果不介意的话可以进入我的邀请页面https://httpsok.com/p/4ODl,虽然对我帮助可能不是特别大但是羊毛谁不爱薅呢?)
找到证书管理,点击免费申请证书(才发现我做演示申请的证书也被算进免费额度里了)
按照httpsok网站提供的指示,填写域名cname的记录,直接复制粘贴就好了(
保存之后直接验证,验证通过后就可以直接申请了,申请完毕之后我们回到证书管理页面,下载证书,直接下载nginx版本的。可以先点击下载之后复制下载链接,然后到服务器使用wget [下载链接],然后unzip解压,也可以直接通过其他应用上传到服务器里
进入nginx的conf.d文件夹,一般是/etc/nginx/conf.d/
cd /etc/nginx/conf.d
在此处创建一个与你域名相同的文件夹
mkdir domain.com(替换成你的域名)
进入这个文件夹
cd domain.com(替换成你的域名)
然后把你刚才下载的证书(解压过后的.pem文件)移动到这里(或者直接在这里下载也行)
然后返回到nginx根目录
cd /etc/nginx
我们再次打开httpsok网站找到自动部署,复制nginx的自动部署命令,大概长这个样子(每个人的都不一样,不要复制我的!!)
curl -s https://get.httpsok.com/ | bash -s 9aN0RN3y4hczqP9wL4
注意:非root用户要在bash前面加上sudo,大概是这样子:
curl -s https://get.httpsok.com/ | sudo bash -s 9aN0RN3y4hczqP9wL4
然后你会看到这样的回应,如果不是那你就失败了(
如果出现相同的回应,就说明你成功了。
完事了之后重启下nginx:
sudo systemctl restart nginx
访问你的域名,这个时候你应该看到你的网站正常运行,并且具有https保护
04.一些小问题
wordpress(或者其他服务)如果出现资源缺失等问题请开启wordpress的https模式
修改wordpress根目录(或者docker容器内的wp-config.php)
添加这三行就行了:
$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
有什么困难的话可以发评论讨论