hello foo bar Saba note | AWSのLinux2でnginxのインストールと設定

AWSのLinux2でnginxのインストールと設定

2018.8.1 (水)

AWSのEC2でLinux2を使っている場合「amazon-linux-extras」というAWS独自のライブラリーを使うと便利です。

https://aws.amazon.com/jp/amazon-linux-2/faqs/#Amazon_Linux_Extras

Amazon Linux Extras
Q: Amazon Linux Extras とは何ですか?
Extras は、安定したオペレーティングシステムで新しいバージョンのアプリケーションソフトウェアを利用可能にする Amazon Linux 2 のメカニズムで、2023 年 6 月 30 日までサポートされます。Extras は、OS の安定性を確保しつつ、最新のソフトウェアを利用できるようにするうえで役立ちます。例えば、5 年間サポートされる安定したオペレーティングシステムに MariaDB の新しいバージョンをインストールすることができます。Extras の例には、Ansible 2.4.2、memcached 1.5、nginx 1.12、Postgresql 9.6、MariaDB 10.2、Go 1.9、Redis 4.0、R 3.4、Rust 1.22.1 などがあります。

アマゾン・リナックス・エクストラを使う

登録されているリスト(トピック)を表示します。インストールできるものとそのバージョンの一覧が表示されます。

# amazon-linux-extras
0  ansible2                        available  [ =2.4.2 ]
1  emacs                           available  [ =25.3 ]
2  memcached1.5                    available  [ =1.5.1 ]
3  nginx1.12                       available  [ =1.12.2 ]
  ...(以下省略)

すでにインストールされているものはavailable、されていないものはdisableとなっています。
各パッケージの詳細は、

amazon-linux-extras info nginx1.12

で確認できます。
インストールします。

# amazon-linux-extras install nginx1.12

確認します。

# nginx -v
# nginx -V

起動します。

# systemctl start nginx.service

確認

curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 01 Aug 2018 06:39:38 GMT
Content-Type: text/html
Content-Length: 3520
Last-Modified: Wed, 13 Dec 2017 18:36:55 GMT
Connection: keep-alive
ETag: "5a317347-dc0"
Accept-Ranges: bytes

自動起動の設定・初期設定

自動起動の設定をします。

# systemctl is-enabled nginx.service
disabled (自動起動していない)
# systemctl enable nginx.service

IPや設定中のドメインにアクセスしてWelcome画面が出ていたら成功です。
うまく立ち上がらなかったときはセキュリティーグループからインバウンドの設定を


バーチャルホストの設定

DebianとかUbuntuのApacheライクな感じした。

# touch /etc/nginx/conf.d/000-default.conf

中身はミニマムでこんな感じ

server {
    listen 80;
    server_name  example.com;
    access_log  /var/log/nginx/example.com.access.log;

    location / {
        root   /home/example/approot/public;
        index  index.php index.rb index.html;
    }
}

書いたら、再起動

# systemctl restart nginx.service

各種よくやる設定

  • IP制限
  • Basic認証
  • リバーズプロキシ

IP制限

やたらと簡単

server {
    listen 80;
    server_name  example.com;
    access_log  /var/log/nginx/example.com.access.log;

    location / {
        root   /home/example/approot/public;
        index  index.php index.rb index.html;
        allow 255.255.255.255; ←これ追加
        deny all; ←これ追加
    }
}

Basic認証

結構簡単。.htpasswdのIDとパスワード設定はApacheと同じ生成方法でOK。

server {
    listen 80;
    server_name  example.com;
    access_log  /var/log/nginx/example.com.access.log;

    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        root   /home/example/approot/public;
        index index.php index.rb index.html;
    }
}

リバースプロキシ

node.jsとかのappサーバーがあるときとかはそのまんま後ろに流してあげるようなリバースプロキシ設定します。
app.example.comにアクセスするとlocalhost:3000に行くやつです。この例でいうと先にlocalhost:3000を起動させておかないとnginxが立ち上がりませんのでご注意。

server{
    server_name    example.com;

    proxy_set_header    Host    $host;
    proxy_set_header    X-Real-IP    $remote_addr;
    proxy_set_header    X-Forwarded-Host       $host;
    proxy_set_header    X-Forwarded-Server    $host;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

   access_log  /home/example/logs/app.access.log;

    location / {
        proxy_pass    http://localhost:8080/;
        proxy_redirect off;
    }

    location /note/ {
        proxy_pass    http://localhost:8081/note/;
        proxy_redirect off;
    }
}

ミニマルな設定はこれでOK。
おまけでリバースプロキシした場合のlocalhost:3000側でのログのとり方です。

PHPの設定

PHPの設定してはnginxの場合ちょっと特殊なのでApacheで設定してリバースプロキシしたほうが楽です。
とはいえnginx単体でwebサーバーを構築する際にはApacheを起動させるのも冗長というものなので、PHPの設定をします。nginxのphpはPHP-FPMを設定します。

端末で使えるWEBブラウザー

localhostとはいえブラウザー使えた方が便利です。日本語にも対応していてテキストベースのみの簡易的なブラウザーで結構重宝します。

# yum -y install lynx

使い方は

lynx localhost:3000

とかやるとテキスト表示してくれます。閉じるときは[ctrl]+[C]で解除。

諸々注意点

リバースプロキシの際のlocationというのが何を基準にしたパスを書くのかがよくわからなかった。

location /foo {
    proxy_pass http://localhost:3000;
    proxy_redirect off;
}

直感的には、/fooでアクセスされたものは、http://localhost:3000のDocumentRoot /を指すものだと思っていたらそうではなくて、http://localhost:3000/fooを指していたというオチでした。ゆえに私の直感的な何を実現したとおもったらrewriteする必要ありという結果に。なのでアプリケーションサーバーの方で/fooでなにがしが実行できてないとNot foundになるというオチがありました。


https://www.nginx.com/
https://dev.classmethod.jp/cloud/aws/install-nginx-on-amazon-linux2-from-extras-repository/
nginxにリバースプロキシ設定してapacheと連携させる