请教一个 Docker 和 Nginx 部署项目的问题?

2023-05-24 13:58:30 +08:00
 Dcynsd

项目使用 PHP 开发,打包成镜像,部署到服务器后,接口使用都没什么问题,但是访问静态资源文件访问不了,在项目根目录下有个资源文件目录 resource,我的访问地址例如:xxx.com/resource/images/xxxx.png

我在本地开发环境是可以访问成功资源文件,本地也是 Docker 运行的,只是是使用 Docker-compose 编排了 PHP 容器和 Nginx 容器。

服务器上是直接运行了 PHP 容器,暴露 9000 端口。

求大神们看看该怎么配置!!!

Nginx 配置如下:

server {
	listen	80;
	server_name	xxx.com;
	root	/var/www/app;
    index	index.php index.html index.htm;

	location / {
		try_files $uri $uri/ /index.php;
	}

	error_page	500 502 503 504	/50x.html;
	location = /50x.html {
		root	/var/www/app;
	}

	location ~ \.php$ {
		fastcgi_pass	127.0.0.1:9000;
		fastcgi_index	index.php;
		fastcgi_split_path_info ^(.+\.php)(.*)$;
		fastcgi_param PATH_INFO $fastcgi_path_info;
		fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include		fastcgi_params;
	}

	location ~ /\.ht {
        deny all;
    }
}
2170 次点击
所在节点    程序员
15 条回复
star7th
2023-05-24 14:04:45 +08:00
你可以参数我的开源项目 showdoc 的 dockerfile https://github.com/star7th/showdoc/blob/master/Dockerfile

我觉得,因为 php 无法单独运行,必须配合 nginx 类的运行中间件,所以,我建议的把 php 跟 nginx 封装到一个 docker 容器里。使用 webdevops/php-nginx:7.4-alpine 作为基础构建镜像就是不错的选择,我基本不用在环境基础问题上纠结什么的。去 dockerhub 搜索下 ,他们还提供不同版本的镜像,比如 webdevops/php-nginx:8.0-alpine
cccssss
2023-05-24 14:14:12 +08:00
127.0.0.1:9000
是访问了 nginx 容器内的 9000 端口
如果 php9000 绑定了机器的 9000 端口
ports:
- 9000:9000
那么就将
127.0.0.1 换成宿主机的内网 ip 就行
或者试试将 127.0.0.1 换成 php 容器的容器名
Dcynsd
2023-05-24 14:17:16 +08:00
@star7th 感谢回复,我先去试一试
chf007
2023-05-24 14:25:02 +08:00
本地也是同样的 Nginx 配置文件么?看线上的配置是把所有的请求都转到 /index.php 上去了,要么把 /resource 单独转发处理一下,要么打包时静态资源发布另外一个独立静态资源域名上
IdJoel
2023-05-24 14:28:41 +08:00
不推荐你这种方法,不行上个 Roadrunner 或者上个 swoole ,打俩容器太麻烦了
Dcynsd
2023-05-24 14:58:19 +08:00
@cccssss 这个连接的地址没问题,项目里面的其它接口都能访问,就只是静态文件访问不了
Dcynsd
2023-05-24 14:59:30 +08:00
@chf007 本地是相同的 Nginx 配置,用 docker-compose 编排在一起
tudou1514
2023-05-24 16:05:59 +08:00
php 不建议玩 docker
yinmin
2023-05-24 16:06:50 +08:00
location / 改成下面这个,再试试:

location / {
root /var/www/app;
index index.php index.html index.htm;
}
Dcynsd
2023-05-24 16:35:58 +08:00
感谢大家的回复,根据 1L @star7th 的回答,我把 Nginx 和 PHP 封装在一个容器里,我的问题解决了
ucando
2023-05-24 16:41:12 +08:00
静态文件访问不了就说明你的静态文件对于 nginx 这个容器来说是不可达的. 如果你把整个项目代码, 包括静态资源, 都打包进了 php 的那个容器, 那就只有 php 的容器可以访问到这些文件, 除非你把这些静态资源独立出来, 通过挂载的方式分别挂给 nginx 和 php 的容器, 这样才能正常跑起来
yprisoner
2023-05-24 17:38:30 +08:00
看下我的项目: https://github.com/nekoimi/rafutaria-php 在 fpm 环境下,php 和 nginx 打包在一起
skyrim61
2023-05-24 17:52:12 +08:00
@tudou1514 为什么不建议呢? 请教下
yumusb
2023-05-24 18:57:32 +08:00
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}



version: '2'
services:
php:
build: ./php/
volumes:
- ${PWD}/www/:/app
restart: always
db:
image: mysql


两个代码片段 够用了。
tudou1514
2023-05-26 17:07:55 +08:00
@skyrim61 其实我也没搞出来为啥,只是最后的结论和进程,线程有关系。我遇到很多次把 php 跑进容器,php 业务崩了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/942560

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX