博客列表 >关于nginx与php的配置

关于nginx与php的配置

耶和华信徒的博客
耶和华信徒的博客原创
2020年05月28日 10:02:2413963浏览

Nginx和PHP的配置

采用nginx+php作为webserver的架构模式,在现如今运用相当广泛。然而第一步需要实现的是如何让nginx正确的调用php。由于nginx调用php并不是如同调用一个静态文件那么直接简单,是需要动态执行php脚本。所以涉及到了对nginx.conf文件的配置。这一步对新手而言需要动点脑筋,对于一般的熟手而言,也有不少同学并没有搞透彻为何要如此这般配置。本文的主要内容为如何在nginx server中正确配置php调用方法,以及配置的基本原理。

一、nginx配置文件修改

配置文件位置
Nginx的配置文件默认位置为:/etc/nginx/nginx.conf

在我的环境中 nginx.conf 在 /etc/nginx/nginx.conf

使用vim打开文件nginx.conf

#vim /etc/nginx/nginx.conf
  1. 配置文件分析
  2. # nginx运行的用户名
  3. user nginx;
  4. # nginx启动进程,通常设置成和cpu的数量相等,这里为自动
  5. worker_processes auto;
  6. # errorlog文件位置
  7. error_log /var/log/nginx/error.log;
  8. # pid文件地址,记录了nginx的pid,方便进程管理
  9. pid /run/nginx.pid;
  10. # Load dynamic modules. See /usr/share/nginx/README.dynamic.
  11. # 用来加载其他动态模块的配置
  12. include /usr/share/nginx/modules/*.conf;
  13. # 工作模式和连接数上限
  14. events {
  15. # 每个worker_processes的最大并发链接数
  16. # 并发总数:worker_processes*worker_connections
  17. worker_connections 1024;
  18. }
与提供http服务相关的一些配置参数类似的还有mail
  1. http {
  2. # 设置日志的格式
  3. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  4. '$status $body_bytes_sent "$http_referer" '
  5. '"$http_user_agent" "$http_x_forwarded_for"';
  6. # access_log记录访问的用户、页面、浏览器、ip和其他的访问信息
  7. access_log /var/log/nginx/access.log main;
  8. # 这部分下面会单独解释
  9. # 设置nginx是否使用sendfile函数输出文件
  10. sendfile on;
  11. # 数据包最大时发包(使用Nagle算法)
  12. tcp_nopush on;
  13. # 立刻发送数据包(禁用Nagle算法)
  14. tcp_nodelay on;
  15. # 链接超时时间
  16. keepalive_timeout 65;
  17. # 这个我也不清楚...
  18. types_hash_max_size 2048;
  19. # 引入文件扩展名与文件类型映射表
  20. include /etc/nginx/mime.types;
  21. # 默认文件类型
  22. default_type application/octet-stream;
  23. # Load modular configuration files from the /etc/nginx/conf.d directory.
  24. # See http://nginx.org/en/docs/ngx_core_module.html#include
  25. # for more information.
  26. include /etc/nginx/conf.d/*.conf;
  27. # http服务上支持若干虚拟主机。
  28. # 每个虚拟主机一个对应的server配置项
  29. # 配置项里面包含该虚拟主机相关的配置。
  30. server {
  31. # 端口
  32. listen 80 default_server;
  33. listen [::]:80 default_server;
  34. # 访问的域名
  35. server_name _;
  36. # 默认网站根目录(www目录)
  37. root /usr/share/nginx/html;
  38. # Load configuration files for the default server block.
  39. include /etc/nginx/default.d/*.conf;
  40. # 默认请求
  41. location / {
  42. }
  43. # 错误页(404)
  44. error_page 404 /404.html;
  45. location = /40x.html {
  46. }
  47. # 错误页(50X)
  48. error_page 500 502 503 504 /50x.html;
  49. location = /50x.html {
  50. }
  51. }
  52. }

要点说明

1、关于error_log 可以设置log的类型(记录什么级别的信息)有:debug、info、notice、warn、error、crit几种

2、关于sendfile
一般的网络传输过程
硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈
使用sendfile后
硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈
可以显著提高传输性能。

3、tcp_nopush和tcp_nodelay
tcp_nopush只有在启用了sendfile时才起作用,
在启用tcp_nopush后,程序接收到了数据包后不会马上发出,而是等待数据包最大时一次性发出,可以缓解网络拥堵。(Nagle化)
相反tcp_nodelay则是立即发出数据包.

php fastcgi配置
分析完了配置文件后开始配置环境。

因为只是配置PHP的服务器,而且只使用一个端口所以只需要改动server部分

在vim中点击‘i’进入编辑模式

  1. server {
  2. listen 80 default_server;
  3. listen [::]:80 default_server;
  4. # 这里改动了,也可以写你的域名
  5. server_name 192.168.17.26;
  6. # 默认网站根目录(www目录)
  7. root /var/www/;
  8. # Load configuration files for the default server block.
  9. include /etc/nginx/default.d/*.conf;
  10. location / {
  11. # 这里改动了 定义首页索引文件的名称
  12. index index.php index.html index.htm;
  13. }
  14. error_page 404 /404.html;
  15. location = /40x.html {
  16. }
  17. error_page 500 502 503 504 /50x.html;
  18. location = /50x.html {
  19. }
  20. # 这里新加的
  21. # PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI协议默认配置.
  22. # Fastcgi服务器和程序(PHP,Python)沟通的协议.
  23. location ~ \.php$ {
  24. # 设置监听端口
  25. fastcgi_pass 127.0.0.1:9000;
  26. # 设置nginx的默认首页文件(上面已经设置过了,可以删除)
  27. fastcgi_index index.php;
  28. # 设置脚本文件请求的路径
  29. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  30. # 引入fastcgi的配置文件
  31. include fastcgi_params;
  32. }
  33. }

修改完成后将vim编辑器切换到一般一半模式(Esc),然后输入:wq保存退出。

之后重启Nginx服务

service nginx restart
以上就配置成功了,但是上面的配置只是nginx配置部分,更多的内容需要继续学习。

测试
我们可以通过下面的方法判断Nginx配置是否成功。

在Nginx的网站根目录(/var/www/)下创建一个php文件,随便起名我的是php_info.php

内容如下:

  1. <?php
  2. // 顺便可以看一下php的扩展全不全
  3. phpinfo();

进入你的网站看看能不能打开文件
你的ip/文件名 例如:192.168.17.26/php_info.php

ok,我们可以看到配置成功了。

二、nginx+php运行原理

上边我们已经配置成功了,现在我们来看下具体的原理。

首先简单的讲一讲原理,目前主流的nginx+php的运行原理如下:
1、nginx的worker进程直接管理每一个请求到nginx的网络请求。

2、对于php而言,由于在整个网络请求的过程中php是一个cgi程序的角色,所以采用名为php-fpm的进程管理程序来对这些被请求的php程序进行管理。php-fpm程序也如同nginx一样,需要监听端口,并且有master和worker进程。worker进程直接管理每一个php进程。

3、关于fastcgi:fastcgi是一种进程管理器,管理cgi进程。市面上有多种实现了fastcgi功能的进程管理器,php-fpm就是其中的一种。再提一点,php-fpm作为一种fast-cgi进程管理服务,会监听端口,一般默认监听9000端口,并且是监听本机,也就是只接收来自本机的端口请求,所以我们通常输入命令 netstat -nlpt|grep php-fpm 会得到:
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1057/php-fpm
这里的127.0.0.1:9000 就是监听本机9000端口的意思。

4、关于fastcgi的配置文件,目前fastcgi的配置文件一般放在nginx.conf同级目录下,配置文件形式,一般有两种:fastcgi.conf 和 fastcgi_params。不同的nginx版本会有不同的配置文件,这两个配置文件有一个非常重要的区别:fastcgi_parames文件中缺少下列配置:
fastcgi_param SCRIPT_FILENAME fastcgi_script_name;
我们可以打开fastcgi_parames文件加上上述行,也可以在要使用配置的地方动态添加。使得该配置生效。

5、当需要处理php请求时,nginx的worker进程会将请求移交给php-fpm的worker进程进行处理,也就是最开头所说的nginx调用了php,其实严格得讲是nginx间接调用php。

了解了上面的这五个简单原理,在nginx中配置php调用方法就变得易如反掌。

配置文件详解:
  1. server {
  2. listen 8011;
  3. server_name test.cn;
  4. location ~ \.php?.*$ {
  5. root /share/test;
  6. fastcgi_pass 127.0.0.1:9000;
  7. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  8. include fastcgi_params;
  9. }
  10. }

1、第一个大括号 server{ }:不必多说,代表一个独立的server,

2、listen 8011:代表该server监听8011端口

3、location ~ .php?.*${ }:代表一个能匹配对应uri的location,用于匹配一类uri,并对所匹配的uri请求做自定义的逻辑、配置。这里的location,匹配了所有带.php的uri请求,例如:http://192.168.244.128:8011/test.php/asdasd http://192.168.244.128:8011/index.php等

4、root /share/test:请求资源根目录,告诉匹配到该location下的uri到/share/teset文件夹下去寻找同名资源。

5、fastcgi_pass 127.0.0.1:9000:这行开始是本文的重点:这行代码的意思是,将进入到该location内的uri请求看做是cgi程序,并将请求发送到9000端口,交由php-fpm处理。

6、fastcgi_param SCRIPT_FILENAME fastcgi_script_name; :这行配置意思是:动态添加了一行fastcgi配置,配置内容为SCRIPT_FILENAME,告知管理进程,cgi脚本名称。由于我的nginx中只有fastcgi_params文件,没有fastcgi.conf文件,所以要使php-fpm知道SCRIPT_FILENAME的具体值,就必须要动态的添加这行配置。

7、include fastcgi_params; 引入fastcgi配置文件
以上就是最简洁版的nginx启动php脚本的最简配置,当重启nginx之后,在/share/test目录下创建一个xx.php文件,输入<?php echo “hello world”; ?>保存,然后在浏览器中访问localhost:8011/xx.php 就可以在网页上显示hello world了。

三、外网访问内网设置

外网IP:http://58.62.21.107:8382 映射内网服务器IP 192.168.17.56 的 82 端口,即:192.168.17.56:82,需要在nginx.conf 配置文件中开放 82 端口给 外网访问,即下面的配置:

[root@ceshi www]# cat /etc/nginx/nginx.conf
  1. # For more information on configuration, see:
  2. # * Official English Documentation: http://nginx.org/en/docs/
  3. # * Official Russian Documentation: http://nginx.org/ru/docs/
  4. user nginx;
  5. worker_processes auto;
  6. error_log /var/log/nginx/error.log;
  7. pid /run/nginx.pid;
  8. # Load dynamic modules. See /usr/share/nginx/README.dynamic.
  9. include /usr/share/nginx/modules/*.conf;
  10. events {
  11. worker_connections 1024;
  12. }
  13. http {
  14. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  15. '$status $body_bytes_sent "$http_referer" '
  16. '"$http_user_agent" "$http_x_forwarded_for"';
  17. access_log /var/log/nginx/access.log main;
  18. sendfile on;
  19. tcp_nopush on;
  20. tcp_nodelay on;
  21. keepalive_timeout 65;
  22. types_hash_max_size 2048;
  23. include /etc/nginx/mime.types;
  24. default_type application/octet-stream;
  25. # Load modular configuration files from the /etc/nginx/conf.d directory.
  26. # See http://nginx.org/en/docs/ngx_core_module.html#include
  27. # for more information.
  28. include /etc/nginx/conf.d/*.conf;
  29. server {
  30. listen 82 default_server; # 服务器端口,和外网映射的需保持一致
  31. listen [::]:82 default_server; # 服务器端口,和外网映射的需保持一致
  32. server_name 192.168.17.56;
  33. root /data/www/;
  34. # Load configuration files for the default server block.
  35. include /etc/nginx/default.d/*.conf;
  36. location / {
  37. }
  38. error_page 404 /404.html;
  39. location = /40x.html {
  40. }
  41. error_page 500 502 503 504 /50x.html;
  42. location = /50x.html {
  43. }
  44. # PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI协议默认配置.
  45. # Fastcgi服务器和程序(PHP,Python)沟通的协议.
  46. location ~ \.php$ {
  47. # 设置监听端口
  48. fastcgi_pass 127.0.0.1:9000;
  49. # 设置nginx的默认首页文件(上面已经设置过了,可以删除)
  50. fastcgi_index index.php;
  51. # 设置脚本文件请求的路径
  52. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  53. # 引入fastcgi的配置文件
  54. include fastcgi_params;
  55. }
  56. }
  57. # Settings for a TLS enabled server.
  58. #
  59. # server {
  60. # listen 443 ssl http2 default_server;
  61. # listen [::]:443 ssl http2 default_server;
  62. # server_name _;
  63. # root /usr/share/nginx/html;
  64. #
  65. # ssl_certificate "/etc/pki/nginx/server.crt";
  66. # ssl_certificate_key "/etc/pki/nginx/private/server.key";
  67. # ssl_session_cache shared:SSL:1m;
  68. # ssl_session_timeout 10m;
  69. # ssl_ciphers HIGH:!aNULL:!MD5;
  70. # ssl_prefer_server_ciphers on;
  71. #
  72. # # Load configuration files for the default server block.
  73. # include /etc/nginx/default.d/*.conf;
  74. #
  75. # location / {
  76. # }
  77. #
  78. # error_page 404 /404.html;
  79. # location = /40x.html {
  80. # }
  81. #
  82. # error_page 500 502 503 504 /50x.html;
  83. # location = /50x.html {
  84. # }
  85. # }
  86. }
说明 * 博文转自 https://zhuanlan.zhihu.com/p/97208252 (非原创;欢迎大家评论)
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议