let's encryptでsslを設定
とある法律判例の全文検索をssl化するにあたって、let's encryptを用いることにした。certbotを使うようになっている。certbotのHPに行くと、httpサーバソフトとosを選んだらcertbot導入の手順が表示されるので、それに従ってみる(今回はNginxとUbuntu(other))を選んだ。
- sshでサーバーにログイン
- certbotをインストール
$ wget https://dl.eff.org/certbot-auto
$ sudo mv certbot-auto /usr/local/bin/certbot-auto
$ sudo chown root /usr/local/bin/certbot-auto
$ sudo chmod 0755 /usr/local/bin/certbot-auto
- certbotコマンドを打つ
- nginxの設定ファイルの自動変更とssl認証を同時に行う
- nginxのssl認証だけ行う(こちらを行った)
$ sudo /usr/local/bin/certbot-auto certonly --nginx
- 自動更新のcronジョブを書く
$ echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/local/bin/certbot-auto renew" | sudo tee -a /etc/crontab > /dev/null
- certbotの動作確認
という手順が表示されるのでその通りに行った。
Nginxで503コードのページをカスタマイズする
なるべく手軽にメンテナンスページを出すための手順
- path/to/root/error/503.htmlにページを用意する。
- path/to/root/error/以下に画像やcss、javascriptなど必要なものを用意する。
- nginxの設定を変更する。必要な部分だけ抜粋
server {
server_name xxx.xxx;
set $maintenance false;
if (-f $document_root/error/503.html ){
set $maintenance true;
}
if ($uri ~ "^/error/") {
set $maintenance false;
}
if ($remote_addr = XXX.XXX.XXX.XXX ){
set $maintenance false;#指定したIPからのアクセスは普通に見れるようにする
}
if ($maintenance = true) {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /error/503.html break;
expires 0;
}
location /error/ {}
<!-- more -->
}
path/to/root/error/503.htmlがあれば、メンテナンス画面を表示する。なければ表示しない。一度nginx設定をリロードすればその後はリロードの必要もない。
末尾に必ずスラッシュを入れる
djangoで末尾スラッシュで無い場合に上手くurlsを組み立てられなかったりしたので・・・djangoは悪くなく、自分の実装のせいなんだけど。
rewrite ^([^.]*[^/])$ $1/ permanent;
でおk
参考:regex - Add slash to the end of every url (need rewrite rule for nginx) - Stack Overflow
書式チェック
$ sudo nginx -t -c /path/to/nginx.conf
でチェック出来る
ltsvでログを取る
※ まずerror_logでは指定出来ないので注意
ログのフォーマットにltsvを追加する。/etc/nginx/nginx.conf内でも /etc/nginx/conf.d/*.conf内でもおk
log_format ltsv "time:$time_local"
"\thost:$remote_addr"
"\tforwardedfor:$http_x_forwarded_for"
"\treq:$request"
"\tstatus:$status"
"\tsize:$body_bytes_sent"
"\treferer:$http_referer"
"\tua:$http_user_agent"
"\treqtime:$request_time"
"\tvhost:$host";
sites-available内でのaccess_logの設定を以下のように変更
access_log /var/log/nginx/access.log ltsv;