在實際開發中個人的電腦中經常需要安裝 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 共同工作的總結先到此告一段落了,后續在開發中遇到的優化配置后再下面持續更新。
待續 ......