热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Apache+Nginx+php共存(一)

在实际开发中个人的电脑中经常需要安装WNMRP、WAMRP、LNMRP、LAMRP等各种开发环境来应对不同的开发需求。此篇主要是对WINDOWS系统下Apache+Nginx+PH

  在实际开发中个人的电脑中经常需要安装 WNMRP、WAMRP、LNMRP、LAMRP等各种开发环境来应对不同的开发需求。

  此篇主要是对WINDOWS系统下 Apache+Nginx + PHP +Mysql + Redis  共存的总结,后续会补上Linux系统下(本机win7+CentOS7.4双系统) 共存的安装步骤。

 

  要点提示,在这我就不再赘述 每个的安装了,单个安装可以参考以下几篇文章:

  •  PHP 官方发行版扩展下载地址
  • windows 下升级安装mysql8,与旧版本5.6共存

  • mysql my.cnf 或my.ini配置文件参数解释(转):

  • Redis&PHP的使用安装-windows版

  • 下载安装 Apache(Windows 64位)

  • ......
  • 具体的配置参数请自行百度了

 

  共存存在的问题和解决方案:

  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      [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 共同工作的总结先到此告一段落了,后续在开发中遇到的优化配置后再下面持续更新。

   

  待续 ......

 


推荐阅读
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 分享2款网站程序源码/主题等后门检测工具
    本文介绍了2款用于检测网站程序源码和主题中是否存在后门的工具,分别是WebShellkiller和D盾_Web查杀。WebShellkiller是一款支持webshell和暗链扫描的工具,采用多重检测引擎和智能检测模型,能够更精准地检测出已知和未知的后门文件。D盾_Web查杀则使用自行研发的代码分析引擎,能够分析更为隐藏的WebShell后门行为。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
author-avatar
陈芝麻烂谷子我勒个去
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有