注:只适用于 linux 系统
升级分为两步,第一步 nginx 转发,第二步配置证书
第一步:sekiro 服务器上安装 nginx
1.一行命令保平安
2.安装 nginx 很简单,一行命令(-y:让你不用手动确认)
sudo apt-get install nginx -y
成功

默认安装到了 /etc/nginx 目录下

3.测试是否成功

浏览器输入 ip 地址

这样是成功的
4.设置 nginx 开机自启动
sudo systemctl enable nginx
5.常用命令
#启动
sudo service nginx start
#关闭
sudo service nginx stop
#查看运行状态
sudo service nginx status
#重启
sudo service nginx restart
6. nginx 有何用
安裝完后,还不知道装 nginx 有啥卵用?

nginx 在这里是用来做反向代理,完成端口转发
例子:
我们现在访问 sekiro 服务的方式是:ip:5602

反向代理之后访问的方式:直接 ip 访问

为何?
我们知道,不带端口号访问,http 默认是 80 端口;所以这时候访问 ip:80 就会被转发到 ip:5602;
同理:ip:5601/asyncInvoke 会被转发到 ip/asyncInvoke
想要这样的效果当然是是需要改下ngnix的配置文件
7.修改 nginx 配置文件
最新版本 nginx 配置文件有好几个:
conf.d:用户自己定义的conf配置文件
sites-available/default:系统默认设置的配置文件
sites-enabled/default:由sites-available中的配置文件转换生成
nginx.conf:汇总以上三个配置文件的内容,同时配置我们所需要的参数
这里我们只需要改 sites-available 下面的 default
路径:/etc/nginx/sites-available/default
推荐用vim修改:
sudo vim /etc/nginx/sites-available/default
修改为下面的内容,
# proxy_pass 被代理的服务
upstream sekiro_server {
server 127.0.0.1:5602;
}
upstream sekiro_nio {
server 127.0.0.1:5601;
}
upstream sekiro_ws {
server 127.0.0.1:5603;
}
server {
listen 0.0.0.0:80;
listen [::]:80;
server_name 127.0.0.1;
server_tokens off;
real_ip_header X-Real-IP;
real_ip_recursive off;
#直接访问ip时 转到到proxy_pass所在的服务sekiro_server
location / {
client_max_body_size 0;
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_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;
proxy_pass http://sekiro_server;
}
#访问ip/asyncInvoke时 转到到proxy_pass所在的服务sekiro_nio
location /asyncInvoke {
client_max_body_size 0;
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_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;
proxy_pass http://sekiro_nio;
}
#访问ip/websocket时 转到到proxy_pass所在的服务sekiro_ws
location /websocket
{
proxy_pass http://sekiro_ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
}
vim 用不好也可以用 Xftp6 打开文件复制粘贴
但是改完之后发现没生效,因为你木有权限!
给配置文件加个写入权限
sudo chmod 666 /etc/nginx/sites-available/default
然后再重新复制粘贴保存就可以了
8.坑
不管哪种方式,从微信这里直接复制粘贴都有个坑!!(可能发表后复制又不会了?)复制会多出一些符号

可以先复制到 pycharm 等编辑器把这个符号给删掉,再复制到配置文件里;或者用 vim 一个个删掉
每次修改配置后要重新启动 ngnix ,配置才生效
sudo service nginx restart

这个报错就是上面说的问题,配置文件格式不对
没其他输出就是成功了
9.转发成功后的调用方式
现在试试浏览器直接输入 ip 地址


试试之前的案例,sekiro_test.html 文件 16 行修改,把 5603 去掉

然后浏览器打开这个html,提示注入成功

远程调用的时候也不用带 5601 端口了!
Invoke 接口 5602 是同步的,上面没有设置反向代理;作者强烈建议使用 NIO 接口访问调用服务!)
浏览器访问:
http://ip/asyncInvoke?group=ws-group-test&action=clientTime

成功
到这里我们就通过 nginx 完成了反向代理,实现了端口转发
第二步:配置证书
接下来把 http 升级为 https
1:申请证书
腾讯云可以申请免费的证书;(国外也有免费证书;可以去找找)
https://cloud.tencent.com/act/pro/ssl

不过这个 DV 型证书必须要绑定证书,不用域名的绑定证书
国内的域名的都需要备案,比较麻烦,要 10-15 天左右;国外的域名不用备案
国外的可以参照这个教程申请免费的域名和免费域名解析
https://zhuanlan.zhihu.com/p/51150313
2.领取免费证书后需要提交信息激活域名
按照腾讯云的提示填写一些资料即可
3.倒数第二步有个域名验证
如果是国外的域名就去上面说到的那个免费域名解析网站https://www.cloudflare.com/zh-cn/网站添加两个解析记录
(如果是国内的域名,就去阿里云或者腾讯云,找到dns云解析服务,添加两个个解析记录)

最后激活成功的页面,

4.下载证书放到 sekiro 服务器上
点击下载证书,解压,进入 Nginx 目录,有两个文件

把这两个文件拷贝到 sekiro 的服务器上

记住存放的路径
5.修改nginx配置文件
还是这个文件 /etc/nginx/sites-available/default,改成下面的内容
注意:
15、66 行需要填上自己的二级域名地址!
68、69 行需要填上自己证书的地址!
upstream sekiro_server {
server 127.0.0.1:5602;
}
upstream sekiro_nio {
server 127.0.0.1:5601;
}
upstream sekiro_ws {
server 127.0.0.1:5603;
}
server {
listen 80;
server_name www+域名这里要改要改要改;
server_tokens off;
real_ip_header X-Real-IP;
real_ip_recursive off;
rewrite ^(.*)$ https://$host$1 permanent;
location /asyncInvoke {
client_max_body_size 0;
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_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;
proxy_pass http://sekiro_nio;
}
location / {
client_max_body_size 0;
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_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;
proxy_pass http://sekiro_server;
}
}
server{
listen 443 ssl;
server_name www+域名这里要改要改要改;
ssl on;
ssl_certificate 证书地址xxxxxx/xxxx.crt;
ssl_certificate_key 证书地址xxxxxx/xxxxxx.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location /websocket
{
proxy_pass http://sekiro_ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
location /asyncInvoke {
client_max_body_size 0;
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_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;
proxy_pass http://sekiro_nio;
}
location / {
client_max_body_size 0;
gzip off;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_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;
proxy_pass http://sekiro_server;
}
}
改完保存,重启 nginx 服务
sudo service nginx restart
6.升级后 https 远程调用方式
浏览器直接访问二级域名

成功,但是发现用二级域名访问的方式请求,有时会被阻断或者无法访问,猜测是域名没有备案的原因;或者是国外 dns 解析的问题
国外未备案域名+国内证书:会出问题
国外域名+国外证书:不会?(没有证实),
国内备案域名+国内证书:没有问题(证实)
但是升级为 https 只是为了注入 https 的网站,wss 能用就行
我们来试试

注入成功

远程调用
https://ip或二级域名/asyncInvoke?group=ws-group-test&action=clientTime


建议还是国内备案个域名
或者远程调用的时候用 ip 不要用域名,verify=False 忽略掉证书检测
res = requests.get("https://ip/asyncInvoke?group=ws-group-test&action=clientTime",verify=False)
print(res.text)
更多每日开发小技巧
尽在未闻 Code Telegram Channel !
未闻 Code·知识星球开放啦!
一对一答疑爬虫相关问题
职业生涯咨询
面试经验分享
每周直播分享
......
未闻 Code·知识星球期待与你相见~
一二线大厂在职员工
十多年码龄的编程老鸟
国内外高校在读学生
中小学刚刚入门的新人
在“未闻 Code技术交流群”等你来!
入群方式:添加微信“mekingname”,备注“粉丝群”(谢绝广告党,非诚勿扰!)