У меня есть две одинаковые капли в цифровом океане. Оба работают под управлением Ubuntu 14.04 с nginx, gunicorn и Django.
Я пытаюсь припарковать свой поддомен на IP-адресе одной из капель. С другой стороны, я успешно припарковал поддомен, и он работает, как задумано.
Прямо сейчас проблемная капля, похоже, может правильно подключиться только через IP-адрес капли. Посещая IP-адрес, можно увидеть экземпляр Gunicorn и прокси-сервер для порта Gunicorn. :9000
не требуется для доступа к нему.
Получив доступ к поддомену, для которого я добавил запись A в моем регистраторе домена, указывающую на IP-адрес этой капли, меня встречает приветственная страница nginx, в которой говорится, что nginx нуждается в дополнительной настройке.
Получив доступ к субдомену и добавив порт Gunicorn :9000
Меня приветствует приложение Django, однако оно не обслуживает статические файлы, как при посещении IP-адреса капли. Также, если я посещаю IP-адрес и добавляю :9000
порт имеет тот же эффект.
Моя конфигурация для nginx идентична для обеих капель, единственная разница - это IP-адрес внутри server_name
.
server {
server_name *.*.*.*;
access_log off;
location /static {
alias /opt/venv/static;
}
location /media {
alias /opt/venv/media;
}
location / {
proxy_pass http://$server_name:9000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
Я также попытался установить server_name для поддомена, но безрезультатно.
Я что-то упускаю? Почему это работает с одной каплей, а с другой - нет?
РЕДАКТИРОВАТЬ: добавлен конфиг для Gunicorn
command = '/opt/venv/bin/gunicorn'
pythonpath = '/opt/venv/fjarrtoolbox'
bind = '127.0.0.1:9000'
workers = 3
Эта строка:
proxy_pass http://$server_name:9000;
Должно быть:
proxy_pass http://127.0.0.1:9000;
Это изменение будет эффективно и безопасно направлять трафик на серверную часть через локальный интерфейс обратной петли.
Кроме того, Gunicorn следует настроить на привязку к порту 127.0.0.1, поскольку он предназначен только для доступа через Nginx. Вы навлекаете на себя дополнительные проблемы, выставляя их на всеобщее обозрение, если вам это не нужно.
Вот что может пойти не так с вашей текущей конфигурацией. Кто-то может отправить запрос на ваш сервер со сторонним именем хоста, например:
curl -H 'Host: example.com' http://1.2.3.4/Hello
Ваш server_name
будет принимать запросы, соответствующие любому имени хоста, поэтому запросы будут обработаны, затем запрос будет проксирован на «example.com» на их порт «9000». Допустим, это чужой сервер Gunicorn, который также оставил открытым порт 9000. Теперь на этот сервер Gunicorn отправляется потенциально атакующий трафик, исходящий с вашего IP-адреса, поскольку вы используете одну из форм открытого прокси.
Вот почему хорошо использовать явные значения для server_name
, для proxy_pass
host и почему ваши внутренние серверы должны явно связываться с портом 127.0.0.1.