当前位置: 首页 > 知识库问答 >
问题:

多个PHP-FPM虚拟主机的最小Docker Nginx配置

侯博裕
2023-03-14

我需要升级一些仍然运行PHP5.6的非常旧的PHP站点,因为我有其他运行PHP7和PHP8的站点,我想我应该利用Docker来实现这一点。

我使用的是hub的默认Docker PHP-FPM和Nginx图像。码头工人。通用域名格式。

我在Ubuntu20下的Docker for Windows和WSL2上运行这个。如果您也在Windows 10上,下面是我能找到的关于使用Docker for PHP开发设置WSL2以完美工作的最佳指南。

Dockerfile文件

FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf
COPY site1.conf /etc/nginx/conf.d/site1.conf
COPY site2.conf /etc/nginx/conf.d/site2.conf

nginx.conf

这是 /etc/nginx/nginx.confnginx官方图像中的默认值,除了两行。

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    # added this once some other SO posts suggested it for multiple server_name directives
    server_names_hash_bucket_size 64;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    # had to add this, the default nginx.conf in the docker image doesn't include sites-enabled
    include /etc/nginx/sites-enabled/*.conf;
}

地点1。形态

server {
    listen         80 default_server;
    listen         [::]:80 default_server;
    server_name    example1.com www.example1.com;
    root           /var/www/example1.com;
    index          index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

}

地点2。形态

server {
    listen         80;
    listen         [::]:80;
    server_name    example2.com www.example2.com;
    root           /var/www/example2.com;
    index          index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

目录结构

/home/me/nginx-test/Dockerfile
/home/me/nginx-test/site1/index.html
/home/me/nginx-test/site1/test.php
/home/me/nginx-test/site2/index.html
/home/me/nginx-test/site2/test.php

把<代码>

/etc/hosts

127.0.0.1  example1.com
127.0.0.1  example2.com

这是我的方法来站起来测试一切。

$ cd ~/nginx-test
$ docker pull nginx
$ docker pull php:5.6.40-fpm
$ docker build -t web:test .
$ docker run --name php -v /home/me/nginx-test/site1:/var/www/example1 -v /home/me/nginx-test/site2:/var/www/example2 -d php:5.6.40-fpm
$ docker run --name test -p 80:80 -v /home/me/nginx-test/site1:/var/www/example1 -v /home/me/nginx-test/site2:/var/www/example2 --link php:php -d web:test

请注意,您必须首先启动php容器,并将其命名为php,以便当您启动Web容器并将其链接到php容器时,它可以找到它。这也是需要的fastcgi_passphp: 9000指令在两个nginx配置文件。

docker ps-a

$ docker ps -a
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS         PORTS                NAMES
37edb342d7b2   web:test         "/docker-entrypoint.…"   5 seconds ago    Up 4 seconds   0.0.0.0:80->80/tcp   test
45ac2fb3d1d4   php:5.6.40-fpm   "docker-php-entrypoi…"   10 seconds ago   Up 9 seconds   9000/tcp             php

现在,当我浏览到http://example1.com和http://example2.com我将列出相应的索引。html页面。

docker日志测试-跟踪

/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
172.17.0.1 - - [23/Mar/2021:22:29:19 +0000] "GET / HTTP/1.1" 200 135 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "-"

现在为了使grep日志更容易一点,让我们将$server_name添加到nginx.conflog_format。有关nginx变量的官方列表的更多详细信息。

nginx。形态编辑,第16行

    log_format  main  '$remote_addr - $remote_user [$time_local] "$server_name $request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

拆毁重建

$ docker stop test && docker rm test && docker stop php && docker rm php
$ docker build -t web:test .
$ docker run --name php -v /home/me/nginx-test/site1:/var/www/example1 -v /home/me/nginx-test/site2:/var/www/example2 -d php:5.6.40-fpm
$ docker run --name test -p 80:80 -v /home/me/nginx-test/site1:/var/www/example1 -v /home/me/nginx-test/site2:/var/www/example2 --link php:php -d web:test
$ docker logs test --follow
172.17.0.1 - - [23/Mar/2021:22:41:25 +0000] "example2.com GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "-"
172.17.0.1 - - [23/Mar/2021:22:41:36 +0000] "example1.com GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "-"
172.17.0.1 - - [23/Mar/2021:22:41:41 +0000] "example1.com GET /test.php HTTP/1.1" 200 85924 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "-"

下面是一些更详细的诊断信息。

卷增加了吗?

$ docker exec -it test bash
root@37edb342d7b2:/# cd /var/www/example1
root@37edb342d7b2:/var/www/example1# ls
index.html  test.php

是的。

在两个容器里?

$ docker exec -it php bash
root@45ac2fb3d1d4:/var/www/html# ls -la /var/www/example2
total 16
drwxr-xr-x 2 1000 1000 4096 Mar 23 21:47 .
drwxr-xr-x 1 root root 4096 Mar 23 22:21 ..
-rw-r--r-- 1 1000 1000  135 Mar 23 21:37 index.html
-rw-r--r-- 1 1000 1000   31 Mar 23 20:33 test.php

共有1个答案

韶英达
2023-03-14

在问一些问题的背景下,我明白了一切,所以我决定把它作为未来读者的指南。

阅读上面的指南。

 类似资料:
  • 我在apache Web服务器上有两个虚拟主机。它们中的每一个都有一个文档根: 我设置了一个php fpm,现在我想为每个fpm设置不同的open_basedir。我搬走了 然后创建了两个php。不同文件夹中的ini。然后,我在ini vhost配置文件中添加了以下代码: 但是当我得到时,一切都与以前不同。我想我错过了什么!如何强制php fpm获取这两个php。每个虚拟主机的ini?

  • 两个虚拟主机(纯静态-html 支持) - Two Virtual Hosts, Serving Static Files http { : server { : listen 80; : server_name www.domain1.com; : access_log logs/domain1.access.log main; : location / {

  • 问题内容: 在运行Apache和PHP 5的一台Linux服务器上,我们有多个带有单独日志文件的虚拟主机。我们似乎无法将虚拟主机之间的php分开。 覆盖在此设置的似乎没有做任何事情。 有没有办法为每个虚拟主机设置单独的php ? 问题答案: 要设置 Apache ( 而不是PHP )日志,最简单的方法是: 如果没有前导“ /”,则假定是相对的。 Apache错误日志页面

  • 本文向大家介绍关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机,包括了关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机的使用技巧和注意事项,需要的朋友参考一下 PHP型虚拟主机这种类型的虚拟主机在国外已经发展了很长时间,技术比较成熟,一般控制面板功能很丰富,管理方面也都比较完备。现在很多中小型企业在建设网站时都会选择PHP虚拟主机来托管自己的网站。之所以选择php虚拟主机,除了它开源和免费

  • 主要内容:Apache虚拟主机类型,3. 虚拟主机配置示例Apache Web服务器可以在SAME服务器上托管多个网站。每个网站不需要单独的服务器机器和apache软件。这可以使用虚拟主机或VHost的概念来实现。 要在Web服务器上托管的任何域(网站应用)都将在apache配置文件中具有单独的条目。 Apache虚拟主机类型 Apache虚拟主机类型有两种 - 基于名称的虚拟主机 基于地址或基于IP的虚拟主机。 1. 基于名称的虚拟主机 基于名称的虚拟

  • 虚拟主机是路由配置中的顶层配置。每个虚拟主机都有一个逻辑名称以及一组域列表,会根据传入请求的主机头路由到对应的域。这允许为单个监听器配置多个顶级域的路径树。一旦基于域选择了虚拟主机,就会进行路由处理,以便查找并路由到相应上游集群或者是否执行重定向。 { "name": "...", "domains": [], "routes": [], "require_ssl": "...",