CentOS7环境,Nginx+php74-php-fpm配置

1. 最简单的使用相对路径的配置法(简单、快捷,但有缺点)

# 请求时使用相对路径dynamic_api
location ^~ /dynamic_api {
    # ThinkPHP6的代码放在这里,指向它的public目录
	alias /opt/wasu/cg-ybt-dynamic/ybt-dynamic/public;
	# 使用相对路径设置时,try_files指令要将其重写
	try_files $uri $uri/ /dynamic_api/index.php;
	index  index.html;
}
location ~ \.php {
    root /opt/wasu/cg-ybt-dynamic/ybt-dynamic/public/;
    # 代理到php-fpm服务,19000是php-fpm服务的端口
    fastcgi_pass 127.0.0.1:19000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

上述配置有一个缺陷:如果这是一个nginx中众多虚拟主机中的一个,那么没问题,但是如果服务器上因为各种因素考虑(尤其是安全因素考虑),只有一个nginx,而且此nginx中只有一个域名(或IP)和端口,而此时nginx下又有多个PHP项目要配,那就不行了(即:多个项目现在它们是同源的,HTTP/HTTPS协议头相同、IP/域名相同、端口相同),因为~ \.php规则(这是让php-fpm解析执行PHP项目代码的FastCGI配置)下的root目录已经被写死了,当然也就不能分别执行多个项目的PHP代码了。总而言之,这种配置文件,注意了一个nginx配置只能挂一个PHP项目。

2. 单Nginx+单域名+多应用部署攻略

如果只有一个nginx并且只有一个IP(或域名),那么配置多个项目的时候,只能使用二级目录(请求子路径)来区分不同的应用,例如A项目是http://my_ip/a/xxxx,B项目是http://my_ip/b/xxx,这种情况下,需要对nginx的配置做出调整,具体做法是,在~ \.php配置规则之前通过if指令动态判断当前请求路径是以/a开头的还是以/b开头的,然后动态设置~ \.php配置项下面的root路径,这样php-fpm就能根据请求路径前缀的不同而动态决定去执行不同项目的PHP代码了,示例:

~ \.php规则之前的配置:

if ($request_uri ~* ^/project_a_api/?.*) {
	set $rootDir "/opt/php_project_a/public";
}
if ($request_uri ~* ^/project_b_api/?.*) {
	set $rootDir "/opt/php_project_b/public";
}

上述配置项的意思是:如果请求路径前缀是project_a_api,那么让执行PHP代码的php-fpm的配置规则~ \.php的root目录为/opt/php_project_a/public,如果请求路径前缀是project_b_api,那么让执行PHP代码的php-fpm的配置规则~ \.php的root目录为/opt/php_project_b/public

然后对~ \.php规则进行微小的调整:

location ~ \.(php)?$ {
	root $rootDir;
	fastcgi_pass 127.0.0.1:19000;
	fastcgi_param PATH_INFO $fastcgi_path_info;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	include fastcgi_params;
}

注意:root目录是根据前面的if指令设置的变量$rootDir动态决定的。

然后是具体的PHP项目的后台接口配置:

location /project_a_api/ {
    index index.php index.html index.htm;
    if (!-e $request_filename){
        rewrite ^/project_a_api/(.*)$ /index.php?s=$1 last;
    }
}
location /project_b_api/ {
    index index.php index.html index.htm;
    if (!-e $request_filename){
        rewrite ^/project_b_api/(.*)$ /index.php?s=$1 last;
    }
}

注意一:这两个项目的后台接口配置规则有一个非常重要的含义:根据各自的请求路径前缀project_a_apiproject_b_api分别走各自的解析规则,在规则中,将各自项目中的路径前缀project_a_apiproject_b_api使用重写指令去掉,然后再转发给执行PHP的规则~ \.php去解析执行,此时,具体的PHP项目中是不会出现project_a_apiproject_b_api路径前缀的(也没有必要出现,因为通常不同的环境下对路径前缀是不同的,比如开发环境不会配置路径前缀,那么使用这种方式处理就最好了,而且代码的执行逻辑,不应该依赖于对它的部署配置不同而导致不同)
注意二:各项目的请求路径前缀和最前面的if判断指令要对得上,否则导致if判断没命中,~ \.php规则下的root没有值了,那当然就报错了。

3. 单nginx+单端口+多应用终极解决方案

按如下步骤配置:

  1. 在nginx的conf目录下新建conf.d目录
  2. 在nginx主配置文件nginx.conf中使用include指令自动扫描加载conf.d目录中的配置文件,具体操作方法是在nginx的主配置文件中的http节点下添加指令include conf.d/*.conf;即可(通常放在最后面)
  3. 然后在conf.d目录中,针对每个项目,单独配置自己的虚拟主机,这个虚拟主机中,配置好要监听的端口、日志、PHP处理、路径重写等信息即可,单个虚拟主机配置示例:
server {
	listen       52091;
	server_name  localhost;

	charset utf-8;

	access_log  logs/host52091.access.log;
	error_log  logs/error52091.log;

	location ~ \.php($|/) {
		root /opt/wasu/ybt-dynamic/public;
		fastcgi_pass 127.0.0.1:19000;
		#设置PATH_INFO,注意fastcgi_split_path_info已经自动改写了fastcgi_script_name变量, 
		#后面不需要再改写SCRIPT_FILENAME,SCRIPT_NAME环境变量,所以必须在加载fastcgi.conf之前设置 
		fastcgi_split_path_info  ^(.+\.php)(/.*)$; 
		fastcgi_param  PATH_INFO $fastcgi_path_info; 
     
		#加载Nginx默认"服务器环境变量"配置 
		include        fastcgi.conf;
	}
	location / {
		index index.php index.html index.htm;
		# 访问路径的文件不存在则重写URL转交给ThinkPHP处理
		if (!-e $request_filename){
			rewrite ^/(.*)$ /index.php?s=$1 last;
		}
	}
}
  1. 然后在主配置文件中,分别针对不同后台服务的不同请求路径,直接根据各自请求路径使用proxy_pass分别代理到各自的虚拟主机上即可,如下示例:
location /project_a_api/ {
	proxy_pass http://127.0.0.1:52090/;
}
location /project_b_api/ {
	proxy_pass http://127.0.0.1:52091/;
}

注意:location必须按这种格式写,proxy_pass指令后面的格式也不能变,因为这种方式在请求转发到具体的虚拟主机上的时候,请求路径前缀/project_a_api//project_b_api/可以被自动rewrite去掉,这样在做开发和环境迁移的时候,开发人员就不必考虑不同环境的URL路径问题了。

此方案的最大优点是:快速复制多份虚拟机配置并在主配置文件中拦截它的请求路径前缀,就可以快速实现一个nginx上配置多个项目。此外,还可以避免各虚拟主机都配在nginx主配置文件中以至于日志也混淆了排查问题比较麻烦等问题,而且各主机配置互相独立,基本上不会互相影响,虚拟主机监听端口也只在服务器上内部使用,不会有多余端口需要开放出来。它也有缺点:如果要基于日志对后台服务和应用做一些分析监控之类的工作,要分别处理,否则会导致监控盲区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网速递520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值