自分の分身を作りたい

理系の大学院生だよ

NginxでBasic認証かけて404エラーが出る

ぜひフォローしてください

Basic認証

簡易であり、ほぼ全てのwebサーバー、ブラウザで使うことができる。 アカウント名とパスワードを繋いでBase64でエンコードして送る。このためパスワードを通信中に抜き取られてしまう可能性がある。

Basic認証 - Wikipedia

Basic認証を実装

DjangoにもBasic認証の機能があるようだが、Nginxで特定のディレクトリに認証機能を実装することにした。

環境

  • AWS EC2サーバー
  • Python(3.6.8)
  • pyenv(1.2.9)
  • Django(2.1.5)
  • gunicorn(19.9.0)
  • nginx(1.14.1)

ここまでの環境構築は前の記事を参考にしてください。

www.so-hack.com

# htpasswdコマンドでBasic認証するためのツール
$ yum install httpd-tools
# アカウント、パスワードを登録
$sudo htpasswd -c /etc/nginx/.htpasswd [account name]
New password: 
Re-type new password: 
Adding password for user [account name]

次にnginx.confをいじります。

今回はhttp://[IPaddress]/hoge

の領域に認証機能を与えようと思います。

nginx.conf
server {
        #listen       80 default_server;
        #listen       [::]:80 default_server;
        #server_name  localhost;
        #root         /usr/share/nginx/html;

        listen  80;
        server_name     [IPaddress];
        client_max_body_size    4G;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://app_server;

                location /hoge/ {
                        proxy_pass http://app_server; ⇦これを忘れて小一時間苦しんだ。
                        auth_basic "secret derectry";
                        auth_basic_user_file "/etc/nginx/.htpasswd";
                }
        }

いじったのはlocation /hoge/の括弧内です。

今回嵌った点は2つありました。1つはBasic認証を実装したい領域(/hoge)について記述するlocation /hoge/location / {}の括弧内に記述しないといけないということ。

2つ目はBasic認証をするために必要なauth_basicと.htpasswdのパスを示すauth_basic_user_fileだけでなく、gunicornを使っているのでproxy_passも/hoge/内で記述しないといけないということ。

またおまえね。

参考にした記事ではWSGIを使ってなかったので、このことに小一時間気づかず。ずっと404Errorを吐き出していました。

認証機能のことについてもですが、WSGIについてもっと勉強しないとダメだなあ。