写在前面:我使用的是Window Server 2012 R2服务器系统,IIS版本:8.5,我的网站各种服务,如PHP等都是在IIS下面跑,原先IIS使用的80端口+443端口,实现https访问。但是微信小程序得用443端口访问wss,所以得解决这个事,再操作这之前,先把IIS下网站的端口改一下,释放80端口,原先的443端口改成8080端口,因为后面要用到443+80端口的监听。查看端口是否被占用,可以CMD输入命令 netstat -ano 去看看占用情况。
要想实现微信小程序https和wss共用443端口,网上有教程使用IIS代理端口,我折腾了半天,没实现。我这里用nginx去监听443端口,然后再代理转发到IIS部署的网站其它端口上,从而实现端口共用。
要想实现https+wss,肯定少不了SSL证书,没有证书的,只能用http+ws,没办法了。大家可以提前去购买服务器的域名服务商下申请SSL证书,然后下载证书,下面部署需要用到证书。
1.nginx的安装
官网下载地址:https://nginx.org/en/download.html
nginx我选用的版本如下:
2.把下载的安装包先解压
3.配置conf文件夹下的nginx.conf
upstream webcom { #这里类似一个别名,在下文中使用
server www.abc.com:8080; #服务器的地址,这个地址可以用IIS部署自己的网站,端口选用8080
keepalive 64;
}
server {
listen 80; #监听80端口,IIS服务器下网站端口建议配置为8080端口
server_name www.abc.com; #这里配置你的域名
rewrite ^(.*)$ https://$host$1 permanent;#用户访问时实现http强制跳转为https
}
server {
listen 443 ssl;#监听端口
server_name www.abc.com;#配置域名,修改为你自己的域名
root html;
index index.html index.htm index.php;
ssl_certificate ./ssl/www.abc.com.pem;#配置SSL证书,修改为你自己的证书
ssl_certificate_key ./ssl/www.abc.com.key;#配置证书密钥,修改为你自己的
access_log ./logs/www.abc.com.log;#配置日志输出,修改为你自己的
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location = /mqtt {#当访问为wss://www.abc.com/mqtt
# 8084就是我们的emq的websocket的端口号
proxy_pass https://www.abc.com:8084; #需要安装EMQ软件,8084端口就是wss通讯端口,这里做代理转发
proxy_redirect off;
proxy_set_header Host www.abc.com:8084;
proxy_set_header Sec-WebSocket-Protocol mqtt;
# 这些都是 websocket必须要配置的
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / {#其余的就转发到网站实现https的访问
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_set_header Connection "";
proxy_pass https://webcom/;#这里使用的是别名,在上面定义了的
}
}
4.nginx配置文件按上面配置,按下面操作开启服务,就能实现443端口https+wss访问了。
5.为了后面命令操作方便,我先做一个nginx批处理bat,先新建一个txt文件,复制以下代码,另存为nginx.bat。
@echo off&color e&Title Nginx 命令行控制台
cls
:Begin
echo **********************************
echo.
echo Nginx 命令行控制台
echo.
echo **********************************
echo. & echo Script: %0% & echo.
echo 请输入命令:
echo.
echo reload 重载 Nginx 配置
echo stop 停止 Nginx 服务
echo quit 退出 Nginx 服务
echo list 查询 Nginx 服务
echo info 输出 Nginx 安装信息
echo.
echo kill 杀死 Nginx 进程
echo start 启动 Nginx 进程
echo restart 重启 Nginx 配置
echo.
echo exit 退出控制台
echo cmd 启动 cmd
echo.&echo.&set /p cmd=请输入:
if "%cmd%"=="kill" goto Kill
if "%cmd%"=="exit" goto End
if "%cmd%"=="start" goto Start
if "%cmd%"=="info" goto Info
if "%cmd%"=="restart" goto ReStart
if "%cmd%"=="reload" goto Reload
if "%cmd%"=="stop" goto Stop
if "%cmd%"=="quit" goto Quit
if "%cmd%"=="list" goto List
if "%cmd%"=="cmd" goto Cmd
cls
goto Begin
:End
exit
:Kill
cls
echo.
echo 尝试杀死 Nginx 进程
echo.
echo.&echo.
taskkill /F /IM nginx.exe
set cmd=
echo.&echo 执行完成
echo.&echo.
goto Begin
:Info
cls
echo.
echo 输出 Nginx 安装信息
echo.
nginx.exe -V
set cmd=
echo.&echo.
goto Begin
:Start
cls
echo.
echo 尝试启动 Nginx 进程
echo.
echo.&echo.
start nginx.exe
set cmd=
echo.&echo 执行完成
echo.&echo.
goto Begin
:ReStart
cls
echo.
echo 尝试杀死 Nginx 进程
echo.
echo.&echo.
taskkill /F /IM nginx.exe
echo.
echo 尝试启动 Nginx 进程
echo.
echo.&echo.
start nginx.exe
set cmd=
echo.&echo 执行完成
echo.&echo.
goto Begin
:Reload
cls
echo.
echo 尝试重新加载 Nginx 配置文件
echo.
echo.&echo.
nginx.exe -s reload
set cmd=
echo.&echo 执行完成
echo.&echo.
goto Begin
:Stop
cls
echo.
echo 停止 Nginx 服务
echo.
echo.&echo.
nginx.exe -s stop
set cmd=
echo.&echo 执行完成
echo.&echo.
goto Begin
:Quit
cls
echo.
echo 退出 Nginx 服务
echo.
echo.&echo.
nginx.exe -s quit
set cmd=
echo.&echo 执行完成
echo.&echo.
goto Begin
:List
cls
echo.
echo 查询 Nginx 服务
echo.
tasklist /fi "imagename eq nginx.exe"
set cmd=
echo.&echo.
goto Begin
:Cmd
cls
start cmd
set cmd=
goto Begin
运行nginx.bat文件,如下:
然后输入start,按回车键,即可开启nginx服务,就可以让微信小程序使用443端口共用https+wss了。
提示:每次修改配置文件,都要输入restart命令重启服务才能生效。
下篇帖子,我再讲以下EMQ X,实现mqtt通讯,以及ws+wss访问如何配置。因为这篇帖子涉及到443端口用nginx代理转发到mqtt服务上。