注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

zjcjack的博客

 
 
 

日志

 
 

(转载)本地Nginx路由,远程PHP解析(mount超时?tcp问题吧)  

2012-02-19 23:58:47|  分类: nginx |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近看了张宴的《PHP在金山游戏运营中的应用》一文,发现里面Nginx解析、远端PHP服务器执行的多人合作开发方式很符合我目前开发的情景,于是尝试着配置了一下。本文就记录下过程和遇到的问题,以作今后参考和查询之用。

简单来说就是这样么一回事:

环境:

1 本机Linux(Ubuntu,64位)+Nginx

2 PHP服务器Linux(CentOS)

 

解决的问题:

1 各程序员开发环境不一,难于统一的批量设置PHP服务器环境。

2 PHP服务器需要安装一个自己开发的64位扩展,但是不是每个人的开发环境都是64位的。

3 虽然可以只配置一台服务器,每个人通过ssh或者mount远端目录到本地来解决服务器困境,但是协同开发变得更易产生文件冲突——两个人有可能需要修改相同文件。

4 由于3会产生文件冲突,所以也失去了svn的同步开发优势。

 

解决的方案:

1 首先将自己的相关开发目录挂载到远端PHP服务器;

2 然后配置自己的Nginx服务器,分发请求到此远端PHP服务器;

3 远端服务器解析之前挂载的特定目录中的PHP文件,并返回结果;

4 最终相当于每个人都有了已经配置好的PHP服务器。

5 对多个人,相同请求PHP服务器执行的挂载目录不同,所以也就没有了文件冲突。

 

方案的原理:

Nginx与PHP之间采用的是TCP FastCGI协议通讯,通过调整PHP FastCGI的监听地址和Nginx的ProxyPass,两者可以分离到不同的服务器上。

Nginx处理浏览器请求,判断其为PHP格式时,根据本身的配置文件,将把解析控制交给ProxyPass设定的PHP服务器处理,并传递相关参数给PHP服务器(一般在/etc/nginx/fastcgi_params中设置)。其中包括DOCUMENT_ROOT、SCRIPT_FILENAME等。PHP服务器根据这些参数最终确定需要解析的PHP文件。而最终的PHP文件其实是挂载的本地文件,所以就实现了文件在本地编辑,而运行在远端执行的效果。

 

遇到的问题:

1 配置本机为NFS服务器,挂载本地目录到远程服务器。远程服务器执行rpcinfo,showmount查看本机NFS运行情况时没有问题,但在mount时总是超时。查看了双方iptables和tcp_wrapper,设置都没有问题。

一般来说,远程服务器mount时如果出错,都会提示相关出错信息。比如server refused,portmap error之类的,根据这些提示信息确定问题出在哪即可。但是这个超时问题却只提示超时,为什么超时却不好判断。直到看到这篇文章以后才觉得会不会是UDP问题。于是换成了TCP方式:>mount -t nfs -o tcp ip:doc-path mount-path,立即挂载成功了。这个问题令我哭笑不得。猜想可能是本机和远程服务器由于不在相同子网域,所以要经过路由;如果路由限制了UDP传输,那么就会导致现在这种情况。

2 本地配置好了PHP文件的ProxyPass,最终却返回502错误。

远程服务器问题。配置php-fpm的listen_address,将127.0.0.1:9000改成9000即可。

 

整个过程:

1 首先本机安装nfsd和portmap,作为nfs服务器。详细配置可以参考鸟哥私房菜中的 简易 NFS服务器设定

2 编辑/etc/exports开放本地目录。例如:

>/var/www/ 远端服务器IP或网域(rw,all_squash,anonuid=33,anongid=33)

3 ssh到远程服务器,将本地开放目录挂载。可以在rc.local中配置启动自动挂载。例如:

>mount -t nfs -o tcp ip:doc-path mount-path

4 调整本地nginx虚拟主机配置,对相关域名配置分发地址。例如:

>/etc/nginx/sites-available/some-server.com

server {
listen   80;

root /var/www/some-path;
index index.php index.html index.htm;

server_name some-server.com;

location / {
try_files $uri $uri/ @rewrites;
}

location @rewrites {
rewrite ^.+$ /index.php last;
}

# pass the PHP scripts to FastCGI server listening on :9000
location ~ \.php$ {
include fastcgi_params;
}

}

>/etc/nginx/fastcgi_params

set $_root ‘php-server-path-mounted-local-develp-path’; #本地目录在远程服务器上的路径

fastcgi_pass    php-server-ip:9000; #远程服务器地址
fastcgi_index   index.php;

fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
fastcgi_param   CONTENT_TYPE            $content_type;
fastcgi_param   CONTENT_LENGTH          $content_length;

fastcgi_param   SCRIPT_FILENAME         $_root$fastcgi_script_name; #重写文件名称
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $_root; #重写根目录
fastcgi_param   SERVER_PROTOCOL         $server_protocol;

fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         bitsucker-nginx/$nginx_version#可以配置这个玩玩

fastcgi_param   REMOTE_ADDR             $remote_addr;
fastcgi_param   REMOTE_PORT             $remote_port;
fastcgi_param   SERVER_ADDR             $server_addr;
fastcgi_param   SERVER_PORT             $server_port;
fastcgi_param   SERVER_NAME             $server_name;

# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

5 ssh远程服务器,修改php-fpm的监听地址,监听9000端口,不限制具体IP。

>/etc/php/php-fpm.conf

#listen=127.0.0.1:9000

listen=9000

6 重启本地、远程相关服务器

over

  评论这张
 
阅读(556)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017