Linux 下 Nginx 与 PHP 的常用配置
模拟场景
模拟一个场景,一台服务器有两个独立项目(网站)ws1 和 ws2,服务器上用 Nginx 做 http 服务器,使用 php 处理动态内容
Nginx
Nginx默认配置文件在 /etc/nginx/nginx.conf
,通过 include
同样可以引入很多具体配置便于分别对项目管理,include 默认路径在 /etc/nginx/conf.d
。为每一个项目(网站)建立一个配置文件有利于清晰的分开配置文件作用范围,不会互相影响,为 ws1 建立一个 ws1-www.conf,一个简单的配置文件大概长这个样子
server {
#使用 one 这个缓存
#proxy_cache one;
#proxy_cache_valid any 10m;
listen 80;
server_name ws1.domain.com;
# upload_max_file_size 2M;
#client_max_body_size 10M;
location / {
root /var/www/ws1;
index index.html;
# try_files $uri $uri/ /index.php?$args;
}
# rewrite /admin$ $scheme://$host$uri/ permanent;
# error_page 401 402 403 404 500 502 503 504 /oops.html;
# location = /oops.html {
# root ;
# }
location ~\.php$ {
root /var/www/ws1;
fastcgi_pass unix:/run/php-fpm/ws1.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Nginx 安装后 conf.d 路径下默认有 php-fpm.conf 配置文件,用于配置 Nginx 与 PHP 的通讯方式,刚才 fastcgi_pass 指定了 cgi 的转发方式,可以是转发到 ip:port 也可以是 sock,以 sock 为例在 conf.d 路径下建立一个单独的对 sock 的配置,如 ws1-php.conf,内容可以是
upstream ws1 {
# ip_hash 算法使请求按照 ip 结果分配访问固定的一个后台服务,不能与 weight、backup 同时使用
#ip_hash;
server unix:/run/php-fpm/ws1.sock;
server 192.168.1.101:8000;
server 192.168.1.102:9000 weight=1;
}
关键信息如下:
- name:用于标识服务器名称,这个服务器是指具体的网站、项目,因此存在多个 upstream 时,name 一定不要重复即可
- server:可以是 sock、地址,表示访问其方式,因为 upstream 经常用于做负载均衡(百度得知),因此一个 upstream 中可以包含多个 server
现在,在 conf.d 下使用 ws1-www.conf 和 ws1-php.conf 实现了对站点 ws1 的独立控制,如法炮制给 ws2 增加同样的两个配置文件即可,注意配置中所有ws1的具体值替换成ws2不能重复。站点的配置文件完成,还要检查主配置文件 /etc/nginx/nginx.conf 是否能正确的使用它们,关键是在文件中是否有这一句 include /etc/nginx/conf.d/*.conf;。
PHP-FPM
Linux下是 php-fpm 在工作,其配置文件默认在 /etc/php-fpm.conf
,其中 include
中记载了包含的其它配置文件的路径,默认为 /etc/php-fpm.d/*.conf
,该目录下可建立多个与Web应用对应的配置文件,每个配置文件中关键信息如下:
- [www] 应用池名称,和 IIS 中进程池类似,可以以项目命名,这样在本地(当前服务器)有多个web应用的情况下可以做到分别管理和识别
- user= 指定本地系统用户名,group= 指定本地系统用户所属组名
- listen=/run/php-fpm/*.sock 表示当前配置要监听的方式,可以是 sock 方式,也可以是 127.0.0.1:9002 这样的 IP 方式,要与 Web 服务器一致(如 Nginx 中的 fastcgi_pass)
同样需要给 ws1 和 ws2 分别提供不同的配置文件,以 php-fpm.d 中默认配置文件为例,按刚才描述改写出两个配置文件分别对应 ws1 和 ws2
[ws1]
xxx
user = nginx
group = nginx
listen=/run/php-fpm/ws1.sock
xxx
[ws2]
xxx
user = nginx
group = nginx
listen=/run/php-fpm/ws2.sock
xxx
至此,已经为 ws1 和 ws2 分别在 Nginx 和 php-fpm 都建立的独立的配置
访问
Nginx 的配置和 php-fpm 的相关配置能够找得到+对的上是配置的关键,nginx.conf 包含了 conf.d 中所有子项配置,/etc/php-fpm.ini 包含了 php-fpm.d 中所有子项配置,所有的子项配置又通过 ws1.sock、ws2.sock 的(或ip:port)方式通讯,这就是 Nginx 和 php 搭配的基本路径,配置好后测试配置是否正确并重启服务查看结果
Nginx -t
systemctl reload php-fpm
systemctl reload nginx
done!