こんにちは、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サーバ周りでやったことでした。