V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Dcynsd
V2EX  ›  程序员

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

  •  
  •   Dcynsd · 310 天前 · 1881 次点击
    这是一个创建于 310 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目使用 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;
        }
    }
    
    15 条回复    2023-05-26 17:07:55 +08:00
    star7th
        1
    star7th  
       310 天前
    你可以参数我的开源项目 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
        2
    cccssss  
       310 天前
    127.0.0.1:9000
    是访问了 nginx 容器内的 9000 端口
    如果 php9000 绑定了机器的 9000 端口
    ports:
    - 9000:9000
    那么就将
    127.0.0.1 换成宿主机的内网 ip 就行
    或者试试将 127.0.0.1 换成 php 容器的容器名
    Dcynsd
        3
    Dcynsd  
    OP
       310 天前
    @star7th 感谢回复,我先去试一试
    chf007
        4
    chf007  
       310 天前
    本地也是同样的 Nginx 配置文件么?看线上的配置是把所有的请求都转到 /index.php 上去了,要么把 /resource 单独转发处理一下,要么打包时静态资源发布另外一个独立静态资源域名上
    IdJoel
        5
    IdJoel  
       310 天前
    不推荐你这种方法,不行上个 Roadrunner 或者上个 swoole ,打俩容器太麻烦了
    Dcynsd
        6
    Dcynsd  
    OP
       310 天前
    @cccssss 这个连接的地址没问题,项目里面的其它接口都能访问,就只是静态文件访问不了
    Dcynsd
        7
    Dcynsd  
    OP
       310 天前
    @chf007 本地是相同的 Nginx 配置,用 docker-compose 编排在一起
    tudou1514
        8
    tudou1514  
       310 天前
    php 不建议玩 docker
    yinmin
        9
    yinmin  
       310 天前
    location / 改成下面这个,再试试:

    location / {
    root /var/www/app;
    index index.php index.html index.htm;
    }
    Dcynsd
        10
    Dcynsd  
    OP
       310 天前
    感谢大家的回复,根据 1L @star7th 的回答,我把 Nginx 和 PHP 封装在一个容器里,我的问题解决了
    ucando
        11
    ucando  
       310 天前
    静态文件访问不了就说明你的静态文件对于 nginx 这个容器来说是不可达的. 如果你把整个项目代码, 包括静态资源, 都打包进了 php 的那个容器, 那就只有 php 的容器可以访问到这些文件, 除非你把这些静态资源独立出来, 通过挂载的方式分别挂给 nginx 和 php 的容器, 这样才能正常跑起来
    yprisoner
        12
    yprisoner  
       310 天前
    看下我的项目: https://github.com/nekoimi/rafutaria-php 在 fpm 环境下,php 和 nginx 打包在一起
    skyrim61
        13
    skyrim61  
       310 天前
    @tudou1514 为什么不建议呢? 请教下
    yumusb
        14
    yumusb  
       309 天前   ❤️ 1
    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
        15
    tudou1514  
       308 天前
    @skyrim61 其实我也没搞出来为啥,只是最后的结论和进程,线程有关系。我遇到很多次把 php 跑进容器,php 业务崩了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3831 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:18 · PVG 18:18 · LAX 03:18 · JFK 06:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.