以下内容,同样适用与NGINX和PHP安装在不同物理机上的场景.
NGINX配置:
server {
listen 80;
server_name test.test.com;
root /var/www/html/Heimdall/public; #注意这里,下面详细解释
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000; #注意这里,下面详细解释
include fastcgi-php.conf;
include fastcgi_params;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #注意这里,下面详细解释
fastcgi_param SCRIPT_FILENAME /www/Heimdall/public$fastcgi_script_name; #注意这里,下面详细解释
}
}
root /var/www/html/Heimdall/public;
这行是代码在宿主机上的位置,必须对应,其实这个目录下的PHP代码没有任何用途,NGINX只会到这个目录下找图片等静态资源(但是你也别删,要挂载给容器用,如果你的PHP服务是放在另一台物理机上的话,可以删)
fastcgi_pass 127.0.0.1:9000;
这行指定了fastcgi服务所在的服务器地址和端口,我们的fastcgi是在容器中的,连接不方便,因此在启动容器时要将宿主机的9000端口和容器的9000端口映射,这样使用起来就相当于在同一台服务器了,如果是另外一台服务器,那么这个IP要写真实的IP
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
如果你是从网上找的别人的NGINX+PHP配置的教程,那么大概率你会看到这行配置,这行配置在NGINX和PHP安装在同一台服务器上的应用来说没有任何问题,$document_root
代表的就是上一步中设置的root路径,在同一台服务器上,NGINX和PHP都去这个目录下找文件,自然能找到.但是如果PHP在容器或者其他服务器上运行的话,就要保证在另一台服务器上也是同样的路径,其实这样对容器或者另外一台服务器的路径要求比较严格,我不太推荐这种方式.
fastcgi_param SCRIPT_FILENAME /www/Heimdall/public$fastcgi_script_name;
这行与上面一行的区别在于没有使用$document_root
变量,而是写死了一个路径,这个路径在你的宿主机上可能并不存在,即使存在它们也没有任何关系,这个指的是容器中的PHP代码路径,这样可以不用专门更改容器中的代码路径,推荐这种方式.
docker-compose.yml中的PHP配置代码段
php8:
build:
context: ./services/php80
args:
PHP_VERSION: php:${PHP80_VERSION}-fpm-alpine3.13
TZ: "$TZ"
container_name: php80
ports:
- "9000:9000" #注意这里,下面详解
volumes:
- /var/www/html/Heimdall/:/www/Heimdall/:rw #注意这里,下面详解
networks:
- default
这个配置不能直接拿来用,真实配置按照你的实际情况来,我解释两个关键点
- "9000:9000"
这段是将容器中的9000映射到宿主机的9000端口,方便NGINX连接
- /var/www/html/Heimdall/:/www/Heimdall/:rw
这段是将宿主机的代码目录挂载到容器中(这就是前面不让你删的原因),冒号前面与NGINX中的root
一致,冒号后面和NGINX中的fastcgi_param SCRIPT_FILENAME
中一致,你会发现我这里和NGINX中的配置并不一致,多了一个public目录,这是因为我用的Laravel框架,公开文件放在了代码跟目录的public下,具体去查Lavavel文档吧,这里不详细说了.
docker-compose up -d
启动PHP服务
nginx -s reload
热重载NGINX
搞定