Apache+Nginx+php共存(一)


  在實際開發中個人的電腦中經常需要安裝 WNMRP、WAMRP、LNMRP、LAMRP等各種開發環境來應對不同的開發需求。

  此篇主要是對WINDOWS系統下 Apache+Nginx + PHP +Mysql + Redis  共存的總結,后續會補上Linux系統下(本機win7+CentOS7.4雙系統) 共存的安裝步驟。

 

  要點提示,在這我就不再贅述 每個的安裝了,單個安裝可以參考以下幾篇文章:

 

  共存存在的問題和解決方案:

  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 共同工作的總結先到此告一段落了,后續在開發中遇到的優化配置后再下面持續更新。

   

  待續 ......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM