我需要升级一些仍然运行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.conf
log_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
在问一些问题的背景下,我明白了一切,所以我决定把它作为未来读者的指南。
阅读上面的指南。
我在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": "...",