arcanum_jp’s blog

おっさんの日記

Nginxを使ってみる。PHPの設定、Dockerベース

Docker使ってるとWebサーバーにNginxを使う例が多いので単独のWebサーバーとしてどう言う設定が必要かちょっと調べてみた。
以下は自分の試行錯誤の形なので本来のNginxの使い方かどうか?は今後また調べる。
しかしこれでエンジンエックスとかどうやったら読むのよ、、んぎんくす?知るか!!ネギンクスでいいんよ
 

ubuntuイメージの取得と起動

docker pull ubuntu


docker images と打ってubuntuのdockerイメージが取得できているのを確認しコンテナを起動する
 

docker run -it -d -p 80:80 ubuntu


 コンテナが起動しているか確認
f:id:arcanum_jp:20200606123014p:plain


コンテナ名がvigilant_greiderでSTATUSがUPなので無事、起動したみたいですね、vigilant_greiderさんこんにちは。名前を指定しない場合2つの単語の組み合わせでコンテナ名が決められるようです。以下、コンテナ名は上記のvigilant_greiderで書いていきます。

ここから先はこのコンテナに入って作業します。以下のコマンドで入ります。rootで入れます。
 

docker exec -it vigilant_greider bash
root@ca0e2d677c4b:/# 

コンテナ起動したらまずやること、パッケージ管理システムの更新です。

apt update

Nginx

パッケージが更新できたら待望のNginxをインストールします。途中地域を選択させられますが、適当に選択する。自分は6. Asia, 79. Tokyoを選択しました。

apt install nginx 
 

インストールできたらバージョン確認してみます。1.17.10みたいです。2020.05.29時点で1.19.0が最新みたいです。僕はこれでいいです。

root@ca0e2d677c4b:/# nginx -v
nginx version: nginx/1.17.10 (Ubuntu)
 

早速Nginxのステータス確認してを開始してみます。

root@ca0e2d677c4b:/# service nginx status
 * nginx is not running
root@ca0e2d677c4b:/# service nginx start
 * Starting nginx nginx       

これで開始されたのでブラウザからアクセスしてみます。ポートは先ほどのdocker ps -aを実行したときのPORTS欄をみるとこんな感じに書いてます。
これはローカルの80番ポートをコンテナの80番ポートにフォワードすると言う意味みたいです。
>| 
0.0.0.0:80->80/tcp

f:id:arcanum_jp:20200606111600p:plain


とりあえずなんか変えてみます。 デフォルトのドキュメントルートは/var/www/htmlのようです。内部にはindex.nginx-debian.htmlがあるのでこれを編集してみます。

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>
    Hello My Nginx!!
</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

上記のこの部分が変更された部分です。

<p>
    Hello My Nginx!!
</p>

これでアクセスしてみます。

f:id:arcanum_jp:20200606112133p:plain

 おおお!変わってる!すげぇ俺天才!ドンドコドコドコ┗(^o^)┛ドコドコ┏(^o^)┓ドンドコドコドコ┗(^o^)┛ドコドコ┏(^o^)┓ドンドコドコ

・・・

あ、、、失礼しました。

ところで何故デフォルトはindex.nginx-debian.htmlなのでしょうか?つかWelcomファイルがindex.nginx-debian.htmlに指定されているってこと?ドキュメントルートって/var/www/htmlって固定なのって疑問が湧きます。Nginxの設定ファイルはこのバージョンだと /etc/nginx/nginx.conf ですのでこれをみていきましょう。httpの中にこんな記述があります。

http{

        ・・・省略

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

ここで指定されたファイルがNginxが起動時に設定として読み込まれるようです。通常はconf.d/にサーバー設定のファイルを入れていくみたいでこの時点では何もありません。

root@ca0e2d677c4b:/# cd /etc/nginx/conf.d/    
root@ca0e2d677c4b:/etc/nginx/conf.d# 

なのでもう一方のファイルが怪しいですね。

root@ca0e2d677c4b:~# ls /etc/nginx/sites-enabled -l
total 0
lrwxrwxrwx 1 root root 34 Jun  6 11:04 default -> /etc/nginx/sites-available/default

おっと、ここは単なるシンボリックリンクで実態は /etc/nginx/sites-available/default のようです。自分はLinux詳しくないのですがなんでこんな風にリンクにしているんざんしょ?これをみてみます。(不要な部分は・・・省略としてます)

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        ・・・省略
        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        ・・・省略
}

ありました!これですね。ドキュメントルートの設定もウエルカムファイルの設定もここでしたね。しかも次のPHPの設定なんかも何気に書かれてます。

PHP

PHPをインストールします。実はここで地雷があります。ここで素直にapt install phpとかやってしまうとオマケにApache2がもれなくついてきます。
下記は別のコンテナでphpパッケージをインストールした場合ですが、Apache2がいます。

root@9195693c2758:/# service apache2 status
 * apache2 is not running

また、WebサーバーとPHPを連携する場合、PHPはモジュール版とCGI版のいずれかを使う必要があり、Nginxはモジュール版は提供されていません。なので自然、CGI版であるFPM ( FastCGI Process Manager )をインストールします。

apt install php-fpm

とりあえずバージョン確認します。7.4なんですね。

root@ca0e2d677c4b:/var/www/html# php -v
PHP 7.4.3 (cli) (built: May 26 2020 12:24:22) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

確認用にこんなファイル作っておきます。

/var/www/html/php/index.php

<?php
    echo 'Hello PHP world!!';
?>

 
この時点では当たり前ですがPHPは連携されずです。試しにアクセスしてみるとこんな感じで403になります。

f:id:arcanum_jp:20200606120214p:plain 


今回はPHPに連携したいってのを確認したかったのでconf.d/に設定ファイルを書くのではなく、先ほどみた/etc/nginx/sites-available/defaultの設定を変えることで実現してみます。Add index.php to the list if you are using PHP とあったので素直に追加します。また、pass PHP scripts to FastCGI serve とありこれが先ほどのFastCGI serverの設定であることがわかりますので適宜コメントをはずします。

server{
        ・・・省略

         # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html index.php;   ** 変更

        ・・・省略

        # pass PHP scripts to FastCGI server
        #
        location ~ \.php$ {  ** コメント外した
               include snippets/fastcgi-php.conf;  **コメント外した
        #
        #       # With php-fpm (or other unix sockets):
               fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; **コメント外した(先ほどのphp -vの値を参考にするのを忘れずに)
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        }  ** コメント外した
}

 
設定を変えたのでNginxが起動できるかテストしてみます。

root@ca0e2d677c4b:/var/www/html# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

お、成功です。設定としては妥当なようです。これでPHPファイルが実行される!と思いきや、実はpfp-fpmが起動していないとダメみたいです。、色々とググっていると、php-fpmのサービスを起動(service php-fpm startとか)であったり /etc/init.d/php-fpm start で開始するのが見かけられますが、どうもそんなサービスもファイルもないみたいで、このケースでは以下に見つけられましたので開始します。あとNginxも再起動しておきます。

追記:php-fpmのサービスはPHPバージョンごとにあるみたいですね(php7.4-fpm みたいなサービス名)

root@ca0e2d677c4b:/var/www/html# /etc/init.d/php7.4-fpm start
root@ca0e2d677c4b:/var/www/html# 
root@ca0e2d677c4b:/var/www/html# service nginx restart
 * Restarting nginx nginx                              


f:id:arcanum_jp:20200606122512p:plain


お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”お”すげぇ俺天才!ドンドコドコドコ┗(^o^)┛ドコドコ┏(^o^)┓ドンドコドコドコ┗(^o^)┛ドコドコ┏(^o^)┓ドンドコドコ
 
しかしこの状態だとなぜか index.phpと指定しないとダメみたいです。Apache2のようなウエルカムファイルの設定とかはまた別のようですが、とりあえずNginxとPHPの連携ができたのでこれで終わります。


 以下に続きます
arcanum.hatenablog.com