IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> docker搭建Nginx+PHP踩坑日记 -> 正文阅读

[系统运维]docker搭建Nginx+PHP踩坑日记

最近学习docker,尝试着搭建一个php的运行环境。因为早期已经搭建了lnmp,所以第一部分是开始尝试,使用容器+宿机的结构;第二部分则是全部都使用docker搭建。

注意,下面命令都是完成后写的,参考即可,最好不要完全复制,可能存在错误!

  • 一.Nginx容器+宿机PHP搭建

踩坑1:pull下Nginx镜像后,使用

docker run -itd --name nginx -port 80:80 nginx

运行。nginx容器正常运行。想使用docker exec -it 39a1f739d83d nginx进入nginx容器修改配置,报错:
在这里插入图片描述
这里是我个人对docker理解问题,这条命令最后的nginx是容器使用的脚本,我使用的nginx,但实际上我们已经启动过了,因此会报错地址已存在!需要改成

docker run -itd --name nginx -port 80:80 bin/bash

可以正常进入容器。
踩坑2:进入容器后,发现很多命令无法使用,例如想要编辑配置文件的vi vim。可以安装,但考虑到容器这么多,不可能每个容器都安装,查看文档后发现可以使用docker映射出目录和配置文件。步骤如下:
1.在自己宿机目录下创建文件,可自定义,根据个人习惯而定。这里我是/home/docker/nginx下分别创建了www,conf,log文件。
2.复制容器中的nginx配置文件,命令:

docker cp 39a1f739d83d:/etc/nginx/nginx.conf /home/docker/nginx/conf/

3.关闭容器后,重新运行命令:

docker run --name nginx -itd -p 80:80 -v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/docker/nginx/log:/var/log/nginx -v /home/docker/nginx/www:/usr/share/nginx/html nginx

踩坑3:在宿机的/home/docker/nginx/conf/nginx.conf里修改配置,发现始终无法访问到指定目录的PHP文件,查看浏览器的响应,发现没有如下的PHP版本信息:在这里插入图片描述
说明根本没有到PHP这里来,经过度娘,是因为ip地址写错了。以往情况我们是设置的:

location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

但是,我们的nginx在docker容器里,因此我们需要设置宿机的内网ip,ifconfig查看:
在这里插入图片描述
踩坑4:再次请求,发现下面报错,并且html都无法访问

No input file specified.

此前root的路径设置的宿机绝对路径,尝试修改root的路径为容器绝对路径,即:

/usr/share/nginx/html/myblog

此时html可以访问了
踩坑5:按照上面配置后,访问报错

404 file not found

这是因为nginx版本不通,document_root高版本已不支持,需要写成绝对路径,要写成绝对宿机的路径,网上还有说法是要设置成容器的绝对路径(此说法也没错),我测试过,此时容器绝对路径依然是404,这部分后面搭建容器PHP时再做解释。我这里就是

location ~ \.php$ {
				fastcgi_pass   172.27.0.3:9000;
				fastcgi_index  index.php;

				fastcgi_param  SCRIPT_FILENAME  /home/docker/nginx/www/myblog/$fastcgi_script_name;
				include        fastcgi_params;
			}

关于root的路径,我测试了一下,必须设置容器绝对路径,否则会报错“踩坑6”
踩坑6:再次请求,提示

Access denied.

拒绝访问!检查/home/docker/nginx/log里的日志,发现报错:

Access to the script ‘/home/docker/nginx/www/myblog’ has been denied
(see security.limit_extensions)" while reading response header from
upstream, client: ***, server: localhost, request: “GET /phpinfo.php
HTTP/1.1”, upstream: “fastcgi://172.27.0.3:9000”, host: “***”

这是因为默认security.limit_extensions只允许访问php,所以造成部分静态文件到PHP部分就出问题,打开注释,设置

security.limit_extensions=

重启PHP服务,请求成功

  • 二、docker的Nginx+PHP+Mysql

踩坑1:不确定是否是版本问题,我通过 docker pull php后,使用命令:

docker run -itd --name php  -p 9000:9000 -v /home/docker/nginx/www:/var/www php

启动容器,发现网页报错502,在network中查看response,发现没有PHP的信息,并且此目录下html文件可以访问。我一开始以为内网ip地址问题,尝试过使用容器名字,容器内网ip都无效。然后怀疑是路径问题,但我使用了一下三种路径全都不行:

location ~ \.php$ {
				fastcgi_pass   172.27.0.3:9000;
				fastcgi_index  index.php;

				fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/myblog/$fastcgi_script_name;
				#fastcgi_param  SCRIPT_FILENAME  /home/docker/nginx/www/myblog/$fastcgi_script_name;
				#fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
				include        fastcgi_params;
			}

然后想查看日志,docker logs -f php,发现什么都没有
在这里插入图片描述
如果不指定版本号,默认pull最近版本,我删除原来php,重新pull php:7.3.5-fpm,同样的启动命令,刷新请求,network中成功显示php信息。我不太确定是否因为版本太高产生的问题,如果有大佬知道原因,可以留言告诉我,感谢。
踩坑2:路径问题。
上一步踩坑后,虽然访问到了,但提示404,又尝试了上面的3个路径全都不行,依然是html可以访问。然后尝试使用挂载时,写的php的的目录/var/www,成功访问。配置:

location ~ \.php$ {
				fastcgi_pass   172.27.0.3:9000;
				fastcgi_index  index.php;

				fastcgi_param  SCRIPT_FILENAME  /var/www/myblog/$fastcgi_script_name;
				#fastcgi_param  SCRIPT_FILENAME  /home/docker/nginx/www/myblog/$fastcgi_script_name;
				#fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
				include        fastcgi_params;
			}

结合第一节踩坑5和踩坑第二节踩坑2,发现fastcgi_param SCRIPT_FILENAME /var/www/myblog/$fastcgi_script_name;这里的路径,是根据PHP的位置来的,可以根据自身情况调整
待更新…

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 23:19:00  更:2021-07-14 23:21:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 0:43:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码