nginxをあれこれ設定してWebサーバを少し理解した

こんにちは、Webエンジニアの小野寺です。 最近はVPSを契約したのでWebサーバ周りの設定などを楽しんでいます。 そこで直近の2ヶ月間ぐらいにWebサーバでやってみたことを3つほど書いてみます。

使っているWebサーバはnginx、OSはCentOS7です。

413 Request Entity Too Largeのエラー対応

複数枚の画像を一度にアップロードするアプリケーションをLaravelで作ったのですが、413 Request Entity Too Largeエラーが出ました。画像が大きすぎるからですね。 php.iniを設定するだけでエラーが消えると思っていたのですがWebサーバも変更しないといけないようです。 解決方法は以下です。

例えば20Mの画像をアップロードしたい場合、nginxは以下のdefault.confの中身を変更します。

# /etc/nginx/conf.d/default.conf

default.confはもしかしたら環境によって違うかもしれません。その場合は ***.confを変更してください。

# sudo vi default.conf

でファイルを開くとデフォルトはこんな記述になってるかと思います。

server {
  listen 80;
  server_name example.com;
  root /var/www/html/hoge;
  index index.php index.html;
}

ここのserver内にclient_max_body_size 20mを追記します。httpsの場合は443の箇所にも同様の追記が必要です。

server {
  listen 80;
  server_name example.com;
  root /var/www/html/hoge;
  index index.php index.html;
  client_max_body_size 20M;
}

設定が終わったらnginxを再起動します。

sudo systemctl restart nginx

以上でnginxの設定は終わり。 あとはphp.ini側でpost_max_sizeとupload_max_filesizeを設定すれば20Mまでアップロードできるはず。

HTTPS化

セキュリティ、見た目どちらにしてもHTTPS化はしておいたほうが良いですよね。(このサイトは安全ではありません。って出したくない) 無料のLet's EncryptでSSL化を行うためにCertbotを使います。 Certbotは無料かつ自動でSSL証明書を発行できるツールで、CSRとKEYファイルの作成からWebサーバー設定まで自動で行ってくれます。 ちなみに僕が以前使っていたsakuraのレンタルサーバは、コンソール画面で無料SSLボタンをポチッとすれば次の日にはHTTPS化が完了しています。 nginxに自力で設定する場合は少なからず知識は必要ですが、30分ぐらいでHTTPS化が完了します。

//certbotインストール
# sudo yum install certbot

//nginx停止
# sudo systemctl stop nginx

//SSL証明書の取得(たぶんメールアドレスとか色々聞かれるので回答します)
# sudo certbot certonly

//nginx起動
# sudo systemctl start nginx

以上でhttps化が完了します。 なお、Let's Encryptの証明書は3ヶ月で有効期限が切れるので、crontabで自動更新処理を書いておくと良いと思います。

特定ディレクトリをBasic認証

管理者以外に見せたくないディレクトリがあったので突貫工事的ですが取り急ぎBasic認証を行いました。 ApacheのBasic認証で利用するファイル「.htpasswd」を使います。nginxとApacheにはファイル互換性があるので.htpasswdをそのまま使えるので便利です。

まずはApacheのコマンドツールをインストール。 CentOSを使っているので以下(Ubuntuは別のコマンド)

# yum install -y httpd-tools

htpasswdコマンドを利用して.htpasswdを作成します。

#htpasswd -c /etc/nginx/.htpasswd [username]
New password: [パスワードを入力]
Re-type new password: [パスワードを入力]
Adding password for user username

最後にnginxの設定をします。例えばhogeディレクトリの場合は

server {
    listen       80;
    server_name  localhost;
    ................
    ................

    location / {
      root   /usr/share/nginx/html;  
      index  index.html index.htm; 
    }

    #Basic認証
    location /hoge {
      root   /usr/share/nginx/html; 
      index  index.html index.htm; 
      auth_basic "Input username and pass"; 
      auth_basic_user_file /etc/nginx/conf.d/.htpasswd;  # Basic認証用のファイル
    }

設定が終わったらnginxを再起動します。

sudo systemctl restart nginx

Basic認証をかけたいディレクトリを定義して、その中にBasic認証ファイルディレクトリを記述します。 これで/hoge にアクセスしたときはBasic認証が求められ、それ以外のディレクトリはBasic認証が求められません。

ちなみBasic認証でログインに成功するとその後はキャッシュにより認証を求められなくなります。 ログアウトしたい場合はhttp://me@hoge.co.jpのようにme@をつけてアクセスすれば再度Basic認証が求められるようになります。

参考:Nginx BASIC認証通過後に 404 エラーになる | ハックノート

参考:Nginxにてベーシック(Basic)認証を有効にする手順 | りんか ネット

最近のWebサーバ周りでやったことでした。