在实际开发中个人的电脑中经常需要安装 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响应代码时要使用哪种类型的标头,->发送Apache和其他Web服务器支持的Status,->将发送符合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 ; #将worker_processes 绑定到特定cup上,避免进程在CPU间切换的开销,win平台不支持
#worker_cpu_affinity ;
#8内核4进程 时的设置方式
#worker_cpu_affinity ; #每个进程最大可打开文件描述符数量(Linux下文件描述符比较广义,网络端口,设备,磁盘文件都是)
#文件描述符用完了,新的连接会被拒绝,参数502错误
#Linux最大可打开文件数可通过命令 ulimit -n FILECNT 或 /etc/ecurity/limits.conf配置
#理论值 系统最大数量 /进程数 但进程间工作量并不是平均分配的,所以可以设置大一些
#一般最大打开文件数会是系统内存的10%(以KB来计算)(称之为系统级限制)
worker_rlimit_nofile ; #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 /
#做反向代理服务器时,maxClient = work_connections * worker_processes / #这个值理论上越大越好,但最多可承受多少请求与配件和网络有关
worker_connections ; #指明使用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 ; # 启动内容压缩,有效降低网络流量
gzip on;
# 过短的内容压效果不佳,压缩过程还会浪费服务器系统资源
gzip_min_length ;
# 可选值 ~ ,压缩级别越高压缩率越高,但对系统的性能要求越高
gzip_comp_level ;
# 压缩的内容类型
gzip_types text/plain text/css application/json application/x-javascript text/xml; # 静态文件缓存
# 最大缓存数量,文件未使用存活期
#open_file_cache max= inactive=20s;
# 验证缓存有效期时间间隔
#open_file_cache_valid 30s;
# 有效期内文件最少使用次数
#open_file_cache_min_uses ; #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 ;
server_name myloc.loc;
rewrite ^/(.*) www.myloc.loc:/$ permanent;
} server {
#修改该端口为8081 避免与tomcat 端口冲突
listen ; #识别的域名
server_name www.myloc.loc; # if ($host =='myloc.loc') {
# rewrite ^/(.*) http://www.myloc.loc:8081/$1 permanent;
# } #charset 默认字符编码,与URL参数乱码问题有关;
charset utf-; #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 /.html; # redirect server error pages to the static page /50x.html
#
error_page /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:; 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:;
# 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 端口冲突
listen ; #识别的域名
server_name www.bres.com; # if ($host =='bres.com') {
# rewrite ^/(.*) http://www.bres.com?$1 permanent;
# } charset utf-; #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=/$ last;
break;
}
} #error_page /.html; error_page /50x.html;
location = /50x.html {
root html;
} # 支持PHP设置
location ~ \.php$ {
root H:/phpapache/www/bres/public;
fastcgi_pass 127.0.0.1:; 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:;
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=/$ last;
break;
}
} } # HTTPS server
#
#server {
# listen 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.-nts-x64
REM Nginx的安装路径
set nginx_home=H:/phpapache/nginx-1.14.
REM RunHiddenConsole.exe的存放目录
set rhc_home=H:/phpapache/nginx-1.14./console REM Windows 下无效
REM set PHP_FCGI_CHILDREN= REM 每个进程处理的最大请求数,或设置为 windows 环境变量
set PHP_FCGI_MAX_REQUESTS= echo Starting PHP FastCGI...
%rhc_home%/RunHiddenConsole.exe %php_nts_home%/php-cgi.exe -b 127.0.0.1: -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: -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 共同工作的总结先到此告一段落了,后续在开发中遇到的优化配置后再下面持续更新。
待续 ......