宿主机NGINX+容器PHP的配置方法

以下内容,同样适用与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

搞定