Назад | Перейти на главную страницу

Конфигурация Nginx для развертывания докеров

Мне было передано повторное развертывание приложения, уже развернутого на сервере 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, вы в основном хотите сделать три вещи:

  • Слушайте test.xxx.yyy.com:80
  • Подавать файлы vom 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 по умолчанию создает виртуальную сеть между контейнерами.