ELB使用時にNginxで特定ディレクトリにIP制限をかける

ELB使用時にNginxで特定ディレクトリにIP制限をかける

Nginxの設定でドハマリしたのでメモです。
タイトル通りELBを使用しているときNginxで特定ディレクトリにIP制限をかけたい場合のconfファイルの設定です。

/admin/ 以下にIP制限をかけたい場合:

upstream unicorn_server {
    server unix:/tmp/unicorn.sock
    fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name myapp.com;

    # インスタンスにはELBのIPからアクセスがくるので
    # ELBのIPを実際のクライアントのIPに置き換える
    # ELBを経由するとX-Forwarded-Forに実際のIPが入る
    set_real_ip_from 10.0.0.0/8; # ELBのIPが複数あるのでまとめて指定
    real_ip_header  X-Forwarded-For;

    keepalive_timeout 5;

    # Location of our static files
    root /var/www/myApp/current/public;
    access_log /var/log/nginx/myApp_access.log;
    error_log /var/log/nginx/myApp_error.log;

    error_page 500 502 503 504 /500.html;

    try_files $uri/index.html $uri @unicorn;

    location /admin/ {
         allow xxx.xxx.xxx.xxx; # 許可したいIP
         deny all;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn_server;
    }

    location @unicorn {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn_server;
    }

    location ~ ^/assets/ {
        root /var/www/myApp/current/public;
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /var/www/myApp/current/public;
    }
}

location /admin/ に allow と deny だけ書いておけばIP制限はかかりますが、そのままですと unicorn にプロキシされずアプリケーションが動かないので notfound となります(実際にはディレクトリは存在しないので)。

今回は時間がなかったのでとりあえず単純に同じことを2回書いときましたが、もう少し上手い書き方が分かり次第アップデートします。

TAG

  • このエントリーをはてなブックマークに追加
kurashita
エンジニア kurashita kurashita

基本的にRuby on Railsで開発してます。最近はvue.jsも。好きな塔は円城です。