Я использую Nginx для прокси-доступа к моему приложению wsgi, обслуживаемому Circus.
Я хочу разрешить трафик в это приложение для некоторых URL-адресов приложения только для определенного IP-адреса.
Пока это выглядит так:
server {
listen 80;
server_name service.dev;
access_log /var/log/service.access.log;
error_log /var/log/service.error.log debug;
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:9000/;
}
location /admin/ {
allow 192.168.5.0/24;
deny all;
}
}
Но не работает. Если у меня есть права, я получаю ошибку 404 вместо proxy_pass.
Вы знаете, как я могу это сделать без необходимости каждый раз копировать / вставлять конфигурацию proxy_pass?
Спасибо.
РЕДАКТИРОВАТЬ 2
Согласно комментариям VBart, я изменил записи в try_files
к $uri @proxy_to_app
. Это позволяет избежать путаницы в порядке названных местоположений (они всегда должны идти последними). Имейте в виду, что если /admin/
каталог существует локально, он будет использоваться вместо прокси.
РЕДАКТИРОВАТЬ
если ты действительно хотите использовать именованное местоположение, чтобы избежать дублирования proxy_pass
для каждого местоположения вы можете использовать следующее:
server {
listen 80;
server_name service.dev;
access_log /var/log/service.access.log;
error_log /var/log/service.error.log debug;
location / {
# Catch all
try_files $uri @proxy_to_app;
}
location /admin/ {
# /admin/ only
allow 192.168.5.0/24;
deny all;
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:9000;
}
}
Это что-то вроде взлома, try_files
требует как минимум двух параметров, в первую очередь он будет искать локальный путь с таким же $uri
(если вы хотите заменить локальные файлы). Во втором случае я указал /dev/null
как второй путь; это никогда не будет использовано.
ОРИГИНАЛ
Попробуйте эту конфигурацию:
server {
listen 80;
server_name service.dev;
access_log /var/log/service.access.log;
error_log /var/log/service.error.log debug;
# Proxy settings
proxy_set_header Host $http_host;
proxy_redirect off;
location / {
# Catch all
proxy_pass http://127.0.0.1:9000/;
}
location /admin/ {
# /admin/ only
allow 192.168.5.0/24;
deny all;
proxy_pass http://127.0.0.1:9000/;
}
}
В location /
блок должен улавливать только те URI, которые впоследствии не совпадают в других блоках местоположения.