本文最后更新于 2024年5月16日。
关于PHP执行用户的问题
对于通过SFTP上传文件搭建的网站,有时会遇到权限问题。要么权限没给够,提示没有权限。一般遇到这种直接给全部权限,也就是‘777’权限可以解决。但对于安全设置严格的web程序这么操作会提示文件夹或文件可以被其他用户读取不安全,这就需要改文件夹或文件的所属用户了。
然而并不知道,用户是谁。下面是我在解决该问题时学习的一些方法。不过到目前位置还是没有理解透彻。
我在搭建nextcloud的时候就遇到了上面提到的问题,参考官方镜像搭建成功的web程序,发现很多文件夹所属用户是‘33’,但是主机系统中并没有这个用户。
php配置文件中的用户组如下,如果不存在,会使用默认用户执行。
user = www-data
group = www-data
www-data
获取nginx和php用户和组
[root@iZ8vbajg9wo8iwynfb1lgeZ data]# ps axu|grep nginx
root 1322844 0.0 0.3 37772 6232 ? Ss 15:12 0:00 nginx: master process nginx -g daemon off;
101 1322890 0.0 0.3 38364 6740 ? S 15:12 0:00 nginx: worker process
root 1331548 0.0 0.0 12108 1052 pts/0 S+ 15:36 0:00 grep --color=auto nginx
[root@iZ8vbajg9wo8iwynfb1lgeZ data]# ps axu|grep php
root 1322682 0.0 1.4 216796 26416 ? Ss 15:12 0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)
admin 1323298 0.1 2.3 223656 44364 ? S 15:13 0:01 php-fpm: pool www
admin 1323731 0.1 2.3 223592 43104 ? S 15:14 0:01 php-fpm: pool www
admin 1324200 0.1 2.2 223484 42808 ? S 15:15 0:01 php-fpm: pool www
root 1331742 0.0 0.0 12108 1076 pts/0 S+ 15:36 0:00 grep --color=auto php
**
docker路径挂载问题
build成功之后的部分日志
117668470 0 drwxr-xr-x 2 root root 24 Sep 21 14:37 /tmp/pear/temp/pear-build-defaultuser6thOCT/install-mongodb-1.11.1/usr/local/lib/php/extensions/no-debug-non-zts-20210902
117668471 8396 -rwxr-xr-x 1 root root 8595192 Sep 21 14:37 /tmp/pear/temp/pear-build-defaultuser6thOCT/install-mongodb-1.11.1/usr/local/lib/php/extensions/no-debug-non-zts-20210902/mongodb.so
Build process completed successfully
Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20210902/mongodb.so'
install ok: channel://pecl.php.net/mongodb-1.11.1
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongodb.so" to php.ini
Removing intermediate container 237ce43c5051
---> b906dd260c8a
Step 14/14 : CMD ["php-fpm", "-F"]
---> Running in 4f4c3a4fbb19
Removing intermediate container 4f4c3a4fbb19
---> 29dc477d866c
Successfully built 29dc477d866c
Successfully tagged php:8.1
有时候LNMP的php和nginx不能自动生成配置文件,需要单独启动,进入容器获取
报错内容
nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
使用相对路径或者绝对路径映射文件夹的时候存在这个问题,因为映射的主机文件夹时新建的空文件夹,覆盖了容器文件夹,因此容器内的目录会被清空。按照下面的方法单独启动容器并进入bash之后就好了。
使用挂载卷可以避免这个问题,即容器中的非空目录是其Dockerfile中使用VOLUME命令声明过的,则容器内文件会被复制到宿主机。
只要宿主机的目录不为空,则一定会覆盖掉容器内的目录。
docker container create --name tmp1 nginx:1.17.0
docker run -it --rm nginx:1.17.0 bash
docker container create --name tmp1 php:8.1
docker run -it --rm php:8.1 bash
docker container create --name tmp1 php:8.0
docker cp tmp1:/usr/local/etc/ /home/php-config #整个文件夹移了过来,需要移动到合适的位置和映射的文件夹一致
docker container rm tmp1
docker container create --name tmp1 nginx:1.17.0
docker cp tmp1:/etc/nginx /home/admin/dockerNextCloud/nginx_config
docker container rm tmp1
docker container create --name tmp1 mysql:8.0
docker cp tmp1:/etc/mysql /home/admin/dockerNextCloud
docker container rm tmp1