标签 nginx 下的文章

研究在已经部署lnmp的服务器上搭建以nginx做直播推流分发的服务端,需要给一键部署的nginx 添加rtmp第三方模块。
先说总结,lnmp一键部署脚本考虑得非常周到,只要简单操作即可无缝编译升级。只是文档说明有点语焉不详,网上流传的其他日志也错漏颇多,跟着别人的日志做差点翻车,把在线的网站给炸down了,还好直接覆盖安装没有影响任何配置。


- 阅读剩余部分 -

实现这种效果,首次打开某个网页的时候要求输入账号密码

QQ截图20191010024834.png

如果不输入或输入错误,会提示

Unauthorized

This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.

我知道这种授权交互这并不优雅毫无设计可言,但应用于部署在公网的内部系统缺不失为一个简陋但有效的一道安全屏障。
以下是nginx和apache的实现流程概要(centos下为例):


- 阅读剩余部分 -

申请微信开放平台的 第三方平台(门槛比想象中要低),配置授权后的响应接口路径,要求格式如下

通过该URL接收公众号或小程序消息和事件推送,该参数按规则填写(需包含/$APPID$,如www.abc.com/$APPID$/callback),实际接收消息时$APPID$将被替换为公众号或小程序AppId。

如果授权到我平台的公众号ID是 gh_abcdefg01234,而我处理公众号消息的程序是 wx.php。授权后,开放平台会把事件和消息推送到

http(s)://mydomain.com/path/gh_abcdefg01234/wx.php

为每一个授权的公众号都物理地部署一个响应脚本不是一个好主意,甚至是一场运维灾难。所以,考虑用rewrite 把公众号的ID 变为 参数推给统一的接口进行处理。

首先我改了设置,把事件和消息接口定义为

https://mydomain.com/wxserivce/$APPID$

然后修改 nginx.conf 的 server {} 部分添加以下规则

#rewrite of wx_3rd_app
location /wxservice/
{
    if (!-e $request_filename)
    {         
        rewrite ^/wxservice\/([^\/]+?)(\/|$) /wxservice/3rd/wx.php?wxid=$1 last;
    }
}

解读以上脚本
location /wxservice/
当请求这个路径时进行检测
if (!-e $request_filename)
如果请求的文件不存在,则触发重写规则
rewrite ^/wxservice\/([^\/]+?)(\/|$) /wxservice/3rd/wx.php?wxid=$1 last;
重写 /wxservice/XXXX/ 把 XXXX 作为参数从定向到 /wxservice/3rd/wx.php?wxid=XXXX 且不是永久重定向(对浏览器而言地址栏显示路径不改变)

也就是说请求
https://mydomain.com/wxserivce/gh_abcdefg01234

等效于请求
https://mydomain.com/wxservice/3rd/wx.php?wxid=gh_abcdefg01234

其实也差别不大,就是看起来逼格有点点不同(误,其实是有现实意义的)

后续:
想尝试修改上例的正则表达式,把请求

/debug/rewrite/xxxxx/fake.php

重写到

/debug/rewrite/get.php?q=xxxxx

规则这样写

rewrite ^/debug\/rewrite\/([^\/]+?)\/fake\.php$ /debug/rewrite/get.php?q=$1 last;

无效报404
检查了很久,怀疑自己对正则表达式的理解和造诣未深(确实是)..最后发现问题不在于正则表达式上
而是后续的php配置和这里产生冲突,证据是重写的最后FLAG last 改为 break 不再匹配后续规则的话,前面的正则匹配没有问题,但PHP的解析却无效了,浏览器直接提示下载了 get.php 的源码。

所以还是得放弃,不用 *.php 结尾则没有问题,替换中段的参数没问题


相关的参考资料

https://www.cnblogs.com/likwo/p/6513117.html

https://blog.csdn.net/u014296316/article/details/81061490

今日配置经历的备忘,依次需要排查的顺序

  • iptables
  • firewalld
  • 域名是否解析正确
  • nginx是否运行
  • 阿里云的安全策略是否已经开通

前4项百度或google会有具体的操作建议,nginx 看 lnmp status 也一目了然

流水账说一下命令的话大概就是

systemctl status firewalld
iptables -L
netstat -an | grep 80
lnmp status

这些都不是今天的原因,直到派工单给阿里客服才告诉我阿里云(不同于腾讯云)还有额外一层安全组策略是在控制台定义端口过滤的

工程师 60841 号 : 您好,查看到实例所属安全组中没有允许80 端口访问的规则,请添加允许该端口访问的规则后再尝试。
添加安全组规则请参考文档:
https://help.aliyun.com/document_detail/25471.html?spm=a2c4g.11186623.6.713.LeJKkB
2019-04-29 12:04:39

操作位置是 : 云服务器 ECS - 网络和安全 - 安全组 - 创建安全组

创建的时候有快速设置,明明看到有面相 webservice的模板,设置后又不见了...需要手动额外添加
添加的方式是安全策略的右则点选 配置规则 然后选中入方向的 http 及 https 服务(对应端口80/443)

QQ截图20190429124914.jpg

最后再确认一遍,在云主机列表(云主机实例) 右则菜单 更多 ,网络和安全,加入安全组 选中刚才创建的策略
QQ截图20190429125110.jpg

确认完成后,实时生效,网站应该可以打开了。

*附阿里的FAQ的一般解决办法
https://help.aliyun.com/knowledge_detail/59367.html#centos