Мне было передано повторное развертывание приложения, уже развернутого на сервере Windows, где серверная часть Python, база данных postgress и интерфейс находятся на одном сервере. Я попросил отделить его и поставить на докеры Linux. Первоначально созданный консультант больше недоступен, поэтому я не совсем уверен, что важно, а что нет.
На моем собственном компьютере с Ubuntu я разрабатываю это с помощью --network = host. Я настроил postgress и бэкэнд python с официанткой, слушающей localhost: 7000, и теперь мне нужно сделать докер nginx.
Инструкции по развертыванию для сервера Windows, связанные с файлом конфигурации nginx:
После редактирования конфигурации на удаленной машине вы можете перезагрузить ее с помощью psexec -w C:\tools\nginx -s nginx -s reload.
(nginx сохраняется в C: \ tools \ nginx)
server_names_hash_bucket_size 64;
proxy_buffering on;
proxy_buffers 24 4k;
proxy_busy_buffers_size 32k;
proxy_set_header Host $host;
proxy_http_version 1.1;
gzip on;
gzip_proxied any;
gzip_min_length 1000;
gzip_types
text/css
text/plain
image/.*
application/javascript
application/json;
# Test setup
server {
listen 80;
server_name test.xxx.yyy.com localhost 127.0.0.1;
root C:/www/html-dev;
error_log C:/www/error-dev.log debug;
index index.html;
try_files $uri $uri/ /index.html;
charset utf-8;
location /api/ {
proxy_pass http://localhost:7000/;
}
location /nginx-status {
stub_status;
}
}
После просмотра этой настройки nginx мой текущий файл dockerfile выглядит примерно так:
FROM nginx
COPY html /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
Есть ли какие-либо предложения по созданию подходящего nginx.conf для этой настройки, или я что-то пропустил? В общем, будут оценены почти любые советы (я новичок).
Согласно опубликованной конфигурации nginx, вы в основном хотите сделать три вещи:
C:/www/html-dev
напрямую (я предполагаю, что это статический контент, например img / css / js)/api/
, это просто проксировалось на http://localhost:7000
(Должен быть сервер приложений)Вы можете использовать эту конфигурацию, но для этого требуется некоторая конфигурация на стороне Docker. Контейнер nginx нуждается в доступе к статическому контенту, который находится в C:/www/html-dev
на старом Win сервере. Можно включить это в изображение (Dockerfile)
COPY html-dev /usr/share/nginx/html
или смонтировать как Объем во время выполнения, как это в докер-сочинять
version: "2.4"
services:
web:
image: nginx:1.16-alpine
volumes:
- ./html-dev:/usr/share/nginx/html
# Access nginx on port 80 of the host (if already taken, change it)
- 80:80
Объемный подход работает быстрее, особенно во время разработки, когда папка содержит много файлов.
В общем, я бы рекомендовал вам использовать докер-сочинять Вот. Это упрощает работу с несколькими контейнерами. Это то, что вам здесь нужно, потому что подход Docker требует одного контейнера на приложение. Таким образом, вы не помещаете свое приложение Python в контейнер nginx.
Поскольку nginx не может напрямую взаимодействовать с серверной частью Python, вам необходимо WSGI
. Без него это работает только с сервером разработки Pythons. Но согласно документации, это не готово к производству и не должно использоваться вне разработки. Ваша конфигурация выглядит так, как будто бэкэнд - это такой сервер разработки (или у вас есть что-то между ними, что не показано).
Я бы рекомендовал правильно решить эту проблему с помощью WSGI, например, вы можете использовать [uWSGI]
(http://flask.pocoo.org/docs/1.0/deploying/uwsgi/) для этого. Здесь вы найдете хорошо задокументированные образы Docker: https://github.com/tiangolo/uwsgi-nginx-flask-docker
Короче говоря, это приведет к другому контейнеру, на который вы отправите свой nginx. localhost
необходимо заменить на это имя службы. Например, если услуга называется uwsgi
в docker-compose.yml
, используйте uwsgi
с соответствующим хостом вместо localhost. Это возможно, поскольку docker-compose по умолчанию создает виртуальную сеть между контейнерами.