68711


これまで公開されてる php, nginx の ２つの docker コンテナを使って  
laravel を動かしているのですが コンテナ のOSが ubuntu で  
今回本番サーバーを ubuntu から AWS amazonlinux2 へ移行したため  
開発環境のOSも念のため amazonlinux2 で構築しなおしたいです

Dockerfile を以下のように書き換えました

[code]

    FROM amazonlinux:2
    
    # install php7.2
    RUN amazon-linux-extras install php7.2 -y
    
    # install nginx
    RUN amazon-linux-extras install nginx1.12 -y
    
    RUN yum -y update
    RUN yum -y install vim unzip curl less procps
    
    # Composer install
    RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    RUN php composer-setup.php --version=1.8.5
    RUN php -r "unlink('composer-setup.php');"
    RUN mv composer.phar /usr/local/bin/composer
    
    ENV COMPOSER_ALLOW_SUPERUSER 1
    ENV COMPOSER_HOME /composer
    ENV PATH $PATH:/composer/vendor/bin
    WORKDIR /home/git
    
    # laravel install
    RUN composer global require "laravel/installer"
    
    # php & nginx configuration
    # COPY ./www.conf /etc/php-fpm.d/www.conf
    # COPY ./php.ini /etc/php.ini
    COPY ./default.conf /etc/nginx/conf.d/default.conf
    
    # automatic start
    ENTRYPOINT /usr/sbin/php-fpm -F && /usr/sbin/nginx -g "daemon off;"
    
[/code]

後半はあまり理解できてなくてこれまで動いていたの２つの Dockerfile の中身を繋いで

[code]

    from php
    from nginx
    
[/code]

の代わりに

[code]

    RUN amazon-linux-extras install php7.2 -y
    RUN amazon-linux-extras install nginx1.12 -y
    
[/code]

に置き換えて  
apt-get を yum に置き換えて EntryPoint を追加しました

状態で起動しても php-fpm しか起動せず nginx が起動しません  
最後の ENTRYPOINT の書き方がまずいんだと思うんですが  
PHP と nginx を同時に起動するにはどう書けばいいのでしょうか

* * *

さらにこの状態で  
`docker exec -it test /bin/bash`  
でコンテナに入って  
`/usr/sbin/nginx -g "daemon off;" &`  
を実行すると nginx が起動して curl は応答するのですが  
php の返答ではなく nginx の静的ページが返却されてしまいます

ps を見ると PHP プロセスは動いてるようなのですが  
nginx と laravel と連携ができてないようです

[code]

    bash-4.2# ps -ef
    UID        PID  PPID  C STIME TTY          TIME CMD
    root         1     0  0 07:29 ?        00:00:00 /bin/sh -c /usr/sbin/php-fpm -F && /usr/sbin/nginx -g "daemon off;"
    root         6     1  0 07:29 ?        00:00:00 php-fpm: master process (/etc/php-fpm.conf)
    apache       7     6  0 07:29 ?        00:00:00 php-fpm: pool www
    apache       8     6  0 07:29 ?        00:00:00 php-fpm: pool www
    apache       9     6  0 07:29 ?        00:00:00 php-fpm: pool www
    apache      10     6  0 07:29 ?        00:00:00 php-fpm: pool www
    apache      11     6  0 07:29 ?        00:00:00 php-fpm: pool www
    root        12     0  0 07:29 pts/0    00:00:00 /bin/bash
    root        18    12  0 07:30 pts/0    00:00:00 nginx: master process /usr/sbin/nginx -g daemon off;
    nginx       19    18  0 07:30 pts/0    00:00:00 nginx: worker process
    nginx       20    18  0 07:30 pts/0    00:00:00 nginx: worker process
    root        21    12  0 07:34 pts/0    00:00:00 ps -ef
    
[/code]

* * *

php.ini と www.conf はインストールしたままデフォルトで  
(user group は apache になってますが下手に変更すると原因切り分けできないのでこのままにしてます)

/etc/nginx/conf.d/default.conf の中身は旧サーバーの中身をコピーして

[code]

    `fastcgi_pass php:9000`
    
[/code]

とこれまでは別コンテナで立ってた PHP の場所を  
www.conf 内に  
`listen = /run/php-fpm/www.sock`  
と書かれてあったので

[code]

    fastcgi_pass unix:/run/php-fpm/www.sock;
    
[/code]

とローカルのソケットに書き換えました

全体は下のような感じです

[code]

    server {
      listen 80;
        index index.php index.html;
        root /home/git/public;
    
      location / {
        try_files $uri $uri/ /index.php$is_args$args;
      }
    
      location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
      }
    }
    
[/code]

docker-compose は build する Dockerfile を変更した以外はこれまで動いてたのと変更なし

コンテナ内で server root の /home/git を ls すると  
ホストの laravel のリポジトリがマウントできています

docker-compose.yml の該当コンテナの記述は以下になります

[code]

      test:
        build:
          context: ../Dockerfiles/amzn2-nginx-laravel
        image: test
        container_name: test
        ports:
          - 8100:80
        volumes:
          - ${WORKSPACE}/dashboard/:/home/git
        networks:
          test_net:
            ipv4_address: 172.20.0.20
        restart: always
    
[/code]

`curl localhost:8100`

を実行したところこれまでのコンテナだと PHP の返答があったのですが  
nginx のデフォルトの  
`Welcome to <strong>nginx</strong> on Amazon Linux!`  
が表示されてしまいます

laravel の初期設定の経験がないので  
他にもどこか設定が必要なのか教えていただけるとありがたいです

必要な情報があれば聞いていただければ提供します


CC BY-SA 4.0
2020-07-16T08:27:01.083
68641
2021-10-20T03:07:55.843
2020-07-16T10:22:39.787
question
php docker laravel nginx
amazonlinux2 docker イメージ上に nginx + laravel の環境を構築したい


> 今回本番サーバーを ubuntu から AWS amazonlinux2 へ移行したため  
>  開発環境のOSも念のため amazonlinux2 で構築しなおしたいです

せっかくコンテナになっているのに、わざわざ変えるのですか？  
それはともかく、

> php-fpm しか起動せず nginx が起動しません

php-fpm がフォアグラウンドで起動して、そこで待ちになっているからだと思います。  
php-fpm の **-F** オプションを付けずにバックグラウンドで起動するとどうでしょう。

[code]

    ENTRYPOINT /usr/sbin/php-fpm && /usr/sbin/nginx -g "daemon off;"
    
[/code]

> php の返答ではなく nginx の静的ページが返却されてしまいます

応答コードは 503 ですか？  
nginx の error_log を確認ください。

もし、503 なら、ソケットファイル **/run/php-fpm/www.sock** のパーミッションを確認ください。  
nginx ユーザーに読み込み許可がないのかもしれません。


CC BY-SA 4.0
2020-07-18T15:20:15.540
68711
2020-07-18T15:20:15.540
4603
68641
answer