Apache+Nginx+php共存(一)
在实际开发中个人的电脑中经常需要安装 WNMRP、WAMRP、LNMRP、LAMRP等各种开发环境来应对不同的开发需求。
此篇主要是对WINDOWS系统下 Apache+Nginx + PHP +Mysql + Redis 共存的总结,后续会补上Linux系统下(本机win7+CentOS7.4双系统) 共存的安装步骤。
要点提示,在这我就不再赘述 每个的安装了,单个安装可以参考以下几篇文章:
- PHP 官方发行版扩展下载地址
- ......
- 具体的配置参数请自行百度了
共存存在的问题和解决方案:
1、PHP 版本如何选择?
答:TS版和NTS版都需要下载下来安装配置。TS线程安全版是与Apache配合使用的,NTS非线程安全版是配合Nginx 使用。个人建议在本地安装4个版本:5.6.37双版本和最新版(7.2.8)双版本,当然在实际开发需求中PHP7以上的版本使用率要高能多,毕竟有很多新特性可以提升程序的运行效率,但为了考虑兼容的话还是安个5.6的老版本在本地,根据实际的开发切换版本就行(把正常使用的TS版写入系统环境变量中作为默认版本)。
注意:不同的版本编译的环境可能不一样,有的是vc14编译的有的是vc15编译的,因此最好检查下本地vc的安装情况,把vc14和vc15都安装上。
2、PHP TS版和NTS版如何配置?
答:因为为了适应不同的HTTP解析器,因此TS版和NTS版的配置文件也有所差异,但差别并不大。主要区别是nts版需要开启PHP-FPM 来与Nginx共同工作,以下是NTS版需要开启的几个扩展选项
;扩展存放的目录 extension_dir = "H:\phpapache\php-7.2.7-nts-x64\ext" ; http://php.net/enable-dl ; 运行运行时配置参数 enable_dl = On ;以下几点是NTS 必须开启的 ; http://php.net/cgi.force-redirect ; 开启CGI模块,一般非线程安全的开启,但改为FAST-CGI 模式,因此参数变为0 cgi.force_redirect = 0 ; http://php.net/fastcgi.impersonate ; 开启 fast-cgi 模式,但需要先开启cgi.force_redirect fastcgi.impersonate = 1 ; http://php.net/cgi.rfc2616-headers ;告诉PHP在发送HTTP响应代码时要使用哪种类型的标头,0->发送Apache和其他Web服务器支持的Status,1->将发送符合RFC 2616的标头 cgi.rfc2616_headers = 1 ;常用扩展开启 ;extension=bz2 extension=curl extension=fileinfo extension=gd2 extension=gettext ;extension=gmp ;extension=intl ;extension=imap ;extension=interbase ;extension=ldap extension=mbstring extension=exif ; exif Must be after mbstring as it depends on it extension=mysqli ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client ;extension=odbc extension=openssl ;extension=pdo_firebird extension=pdo_mysql ;extension=pdo_oci ;extension=pdo_odbc ;extension=pdo_pgsql ;extension=pdo_sqlite ;extension=pgsql ;extension=shmop ; The MIBS data available in the PHP distribution must be installed. ; See http://www.php.net/manual/en/snmp.installation.php ;extension=snmp ;extension=soap extension=sockets ;extension=sqlite3 ;extension=tidy ;extension=xmlrpc ;extension=xsl ;redis extension=igbinary extension=redis ;当然进行调试还需要安装Xdebug扩展
注意红色标记的地方
3、Apache 和 Nginx 的冲突怎么解决?如何配置?
答:首先是端口冲突的问题,根据实际开发情况,哪个经常用到就把哪个的端口改为80端口,另一个可重新改个新端口,如8081(8080端口被本地安装tomcat 占了)。当然同时都用的话,需要在访问的地址后面添加指定的端口号。
Apache 可以添加进系统服务,比较方便点;Nginx 的话需要手动开关,麻烦了点,因为Nginx需要配合php-cgi才能正常工作。
以下是nginx.conf的配置文件和部分注解(有些是优化配置)
#user nobody; #阻塞和非阻塞网络模型: #同步阻塞模型: #一请求一进(线)程,当进(线)程增加到一定程度后cup消耗量较大,性能急剧下降,负载率不高 #nginx基于事件的非阻塞多路复用(epoll或kquene)模型: #一个进程在短时间内可以响应大量的请求 #建议值 <= cpu 核心数量,一般高于cup数量不会带来好处,容易出现进程切换开销的负面影响 worker_processes 4; #将worker_processes 绑定到特定cup上,避免进程在CPU间切换的开销,win平台不支持 #worker_cpu_affinity 0001 0010 0100 1000; #8内核4进程 时的设置方式 #worker_cpu_affinity 00000001 00000010 00000100 10000000; #每个进程最大可打开文件描述符数量(Linux下文件描述符比较广义,网络端口,设备,磁盘文件都是) #文件描述符用完了,新的连接会被拒绝,参数502错误 #Linux最大可打开文件数可通过命令 ulimit -n FILECNT 或 /etc/ecurity/limits.conf配置 #理论值 系统最大数量 /进程数 但进程间工作量并不是平均分配的,所以可以设置大一些 #一般最大打开文件数会是系统内存的10%(以KB来计算)(称之为系统级限制) worker_rlimit_nofile 524288; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { #并发响应能力的关键配置 #nginx最大负载量,每个进程允许最大同时连接数 maxConnections = worker_processes * work_connections #注意:maxConnections 不等同于可响应的用户数量 #因为一般一个浏览器会同时开2条连接,如果反向代理,nginx到后端服务器的连接也要占用连接数 #因此,做静态服务器时,一般 maxClient = work_connections * worker_processes /2 #做反向代理服务器时,maxClient = work_connections * worker_processes /4 #这个值理论上越大越好,但最多可承受多少请求与配件和网络有关 worker_connections 20000; #指明使用epoll 或kquene (*BSD) #使用epool 仅用于linux2.6以上内核,可以大大提高nginx的性能 #use epoll; #备注:要达到超高负载下最好的网络响应能力,还需要优化与网络相关的Linux内核参数 } http { #mime type映射 include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #关闭此项可减少IO开销,但无法记录访问信息,不利于业务风险,一般运维情况不建议使用 access_log off; #access_log logs/access.log main; #只记录更为严重的错误日志,可减少IO压力 error_log logs/error.log crit; #启用内核复制模式,应该保持开启以确保达到最快的IO效率 sendfile on; # 缓存发送请求 # 启动如下2项配置,会在数据包达到一定大小后再发送数据 # 这样会减少网络通信的次数,降低阻塞概率,但也会影响响应的及时性 #比较适合于文件下载这类大数据包通信场景 #tcp_nopush on; #tcp_nodelay on|off on表示禁用Nagle算法 # 最大连接时间 # HTTP1.1支持持久化连接alive # 降低每个连接的alive 时间可在一定程度上提高可响应的连接数,所以可以适当降低此值(秒) keepalive_timeout 30; # 启动内容压缩,有效降低网络流量 gzip on; # 过短的内容压效果不佳,压缩过程还会浪费服务器系统资源 gzip_min_length 1000; # 可选值 1~9 ,压缩级别越高压缩率越高,但对系统的性能要求越高 gzip_comp_level 4; # 压缩的内容类型 gzip_types text/plain text/css application/json application/x-javascript text/xml; # 静态文件缓存 # 最大缓存数量,文件未使用存活期 #open_file_cache max=655350 inactive=20s; # 验证缓存有效期时间间隔 #open_file_cache_valid 30s; # 有效期内文件最少使用次数 #open_file_cache_min_uses 2; #server 表示一个虚拟主机,一台服务器可配置多个虚拟主机 #重点:server_name 指明域名后需要在系统hosts(C:\windows\system32\drivers\etc)文件中指明改域名指向的ip地址 #Linux 的hosts 文件地址 /etc/hosts #一个域名对应一个ip ,一个ip可关联多个域名 #rewrite 语法 rewrite <regex> <replacement> [flag]; #rewrite参考 https://www.cnblogs.com/czlun/articles/7010604.html server { listen 8081; server_name myloc.loc; rewrite ^/(.*) www.myloc.loc:8081/$1 permanent; } server { #修改该端口为8081 避免与tomcat 8080 端口冲突 listen 8081; #识别的域名 server_name www.myloc.loc; # if ($host =='myloc.loc') { # rewrite ^/(.*) http://www.myloc.loc:8081/$1 permanent; # } #charset 默认字符编码,与URL参数乱码问题有关; charset utf-8; #access_log logs/host.access.log main; #一个server下可配置多个location,用来匹配同一域名下不同URI的访问 #root 站点根目录 #index 默认主页 #proxy_pass 转发 后跟系统地址 location / { root H:/phpapache/www/BookShop; #index 默认首页 index index.php index.html index.htm; # deny all; 拒绝请求,返回403 #允许请求 allow all; # yii rewrite # try_files $uri $uri/ /index.php?$args; #支持YII PHAH_INFO 访问 if (!-e $request_filename) { rewrite ^/(.*)$ /index.php last; } } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # 支持PHP设置 location ~ \.php$ { root H:/phpapache/www/BookShop; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; #$document_root 就是指前面“root”所指的站点路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # location ~ / { # root H:/phpapache/www/BookShop; # index index.php # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # #$document_root 就是指前面“root”所指的站点路径 # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # include fastcgi_params; # if (!-e $request_filename) { # rewrite ^/(.*)$ /index.php last; # break; # } # } } #server bres server { #修改该端口为8081 避免与tomcat 8080 端口冲突 listen 8081; #识别的域名 server_name www.bres.com; # if ($host =='bres.com') { # rewrite ^/(.*) http://www.bres.com?$1 permanent; # } charset utf-8; #access_log logs/host.access.log main; #一个server下可配置多个location,用来匹配同一域名下不同URI的访问 #root 站点根目录 #index 默认主页 #proxy_pass 转发 后跟系统地址 location / { root H:/phpapache/www/bres/public; #index 默认首页 index index.php index.html index.htm; # deny all; 拒绝请求,返回403 #允许请求 allow all; #支持PATH_INFO模式访问(TP框架) if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; break; } } #error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # 支持PHP设置 location ~ \.php$ { root H:/phpapache/www/bres/public; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; #$document_root 就是指前面“root”所指的站点路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ / { root H:/phpapache/www/bres/public; index index.php fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; #$document_root 就是指前面“root”所指的站点路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; break; } } } # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
特别提醒一下:在nginx.conf 中自定义了多个域名的话需要在系统hosts文件中指明改域名指向的是本地,不然的话浏览器会直接进行外网访问,不会访问本地的服务。
windows下hosts文件在C:\windows\system32\drivers\etc
Linux 的hosts 文件地址 /etc/hosts
配置完nginx.conf 文件后 在nginx安装目录下 运行cmd 命令: nginx -t 检查配置是否有问题,可根据提示进行修改
直到显示:ok 、successful 表明配置完成
下面是Nginx+php-cgi 的开启关闭 步骤:
-
- 1、下载 RunHiddenConsole【隐藏dos黑窗口工具】 (之前找了下,各种分享的都需要下载豆子,这里免费提供百度云资源:链接:https://pan.baidu.com/s/1WDKg7SfwuT5cCRTfe9AlTw 密码:xhb4)
- 2、在nginx下新建个管理目录,如console文件夹,把之前下载的RunHiddenConsole文件放进去。准备写2个bat文件进行开启和关闭管理
- 3、在console文件加下创建start.bat文件,写入以下代码
@echo off REM PHP NTS版的安装目录 set php_nts_home=H:/phpapache/php-7.2.7-nts-x64 REM Nginx的安装路径 set nginx_home=H:/phpapache/nginx-1.14.0 REM RunHiddenConsole.exe的存放目录 set rhc_home=H:/phpapache/nginx-1.14.0/console REM Windows 下无效 REM set PHP_FCGI_CHILDREN=5 REM 每个进程处理的最大请求数,或设置为 windows 环境变量 set PHP_FCGI_MAX_REQUESTS=1000 echo Starting PHP FastCGI... %rhc_home%/RunHiddenConsole.exe %php_nts_home%/php-cgi.exe -b 127.0.0.1:9000 -c %php_nts_home%/php.ini REM 注意上面代码中的9000端口号要与nginx的配置文件nginx.conf中fastcgi_pass 参数的端口号对应 REM 或者写成下面的格式,前提是RunHiddenConsole.exe与该bat文件在同一文件夹下 REM RunHiddenConsole %php_nts_home%/php-cgi.exe -b 127.0.0.1:9000 -c %php_nts_home%/php.ini echo Starting nginx... %rhc_home%/RunHiddenConsole.exe %nginx_home%/nginx.exe -p %nginx_home%
- 4、在console文件加下创建stop.bat文件,写入以下代码关闭程序进程
@echo off echo Stopping nginx... taskkill /F /IM nginx.exe > null echo Stopping PHP FastCGI... taskkill /F /IM php-cgi.exe > null exit
执行stop.bat文件后会在console目录下生产一个null空文件,不用管它
配置完毕后点击start.bat 启动nginx和php-cgi ,切换浏览器进行访问测试,如果能正常访问表明配置没有问题,后面根据需求进行 rewrite 重写伪静态配置就好了,详细的配置可参看使用的框架说明,上面的案例中写了YII 和 TP框架的重写规则。
以下是nginx 1.14 + php7.27-nts 8081 端口的测试访问截图
以下是Apache 2.4 + php7.0.12-ts 80端口的访问测试截图
windows系统下 Apache和Nginx 共同工作的总结先到此告一段落了,后续在开发中遇到的优化配置后再下面持续更新。
待续 ......