原文链接:https://www.jianshu.com/p/a28b6ecd41a8
自从去年6月份毕业以后,从前端转到了后端,也就很久没有写文章记录了。
[原文地址:掘金](https://juejin.im/post/5af9276b5188254287734196)
### 前情提要:
测试服务器被新人误操作直接删除了根目录,奈何只能重装服务。结果导致微信扫码支付时二维码显示不出来。
### 已知情况:
测试环境访问地址为:http://www.excample.com:8067
部署环境:Nginx + PHP
服务器做过路由端口映射处理,询问运维人员,得知是将外网的8067映射到内网的80端口
### 跟踪调试步骤:
1、通过谷歌开发工具查看,获取的 SERVER_PORT 不正确,正确为8067
![谷歌开发工具](http://upload-images.jianshu.io/upload_images/2376873-edb6856007c4a7ef?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2、既然得知是端口获取的问题,而且代码没有改动,是服务器重新部署的缘故导致的,所以想来也是配置的问题。
一开始怀疑是nginx的配置
!['nginx配置'](http://upload-images.jianshu.io/upload_images/2376873-7bd40d3a9e4db9d4?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
把监听的80端口改成8067,结果不能访问。
那是当然,毕竟路由端口是映射到了内网的80而不是8067。
3、排除了上一步,接下去这最关键的想法折腾了我好久。我想怎么让 server_post 拿到的是外网端口8067而不是内网端口80。
接下去就是各种百度,这过程中让我学习到了一个知识点:php中的 server 全局变量是怎么获取的?
nginx的核心模块中有些内置变量,如下图这些:
![nginx内置变量](http://upload-images.jianshu.io/upload_images/2376873-f2b46c0f5634c24e?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
而且是以fastcgi模式运行PHP,所以nginx会将这些变量传递给fastcgi,而fastcgi又会将这些作为PHP的全局变量
![image](http://upload-images.jianshu.io/upload_images/2376873-509f92c00dacdda7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
到这里,我才发现还有fastcgi的配置之说。那就仔细去看看fastcgi的配置。
![image](http://upload-images.jianshu.io/upload_images/2376873-3ab1a4929e92739b?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这下可好,那我把 $SERVER_PORT 直接改成8067,获取到的确实为8067了,二维码图片也出来了。可是再想想,这样改动不合理,假如端口映射规则修改了,岂不是还要改配置。所以这个方法不可行,另寻他法。
4、开始怀疑服务器重新部署后路由映射规则也被改动了
既然nginx内置变量$server_port只能拿到nginx配置中的的监听端口。那么server段中的监听怎么着也得改成8067,要做的就是将路由映射修改为:外网的8067映射到内网的8067。
至此,问题解决了。一直以为路由映射规则没有改动,就一直死磕在了nginx和fstcgi的配置上了,耗费了太多时间。不过也好,深入了解了 php 中 server 等一些全局变量的来源。
>不积跬步无以至千里