Date Modified Tags nginx / memo

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

でチェック出来る

参考:nginxで設定ファイルチェック - Qiita

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;

参考:nginxのerror_logはformat指定できない. - としたにあんの左脳