Estoy tratando de ejecutar dos sitios en django en el mismo servidor con una IP diferente, ocurre un error de que el puerto está ocupado, arreglé los puertos, pero el sitio no se inicia. Dime donde esta el error por favor Ip trabajo, cuando voy a la segunda ip obtengo redireccionamientos al primer sitio. Todos los ajustes se especificaron para el segundo sitio. Al final, agregué la configuración nginx del primer sitio
Este es el segundo archivo docker-compose y su configuración. te agradeceria mucho tu ayuda
.env
#Django # Should be one of dev, prod MODE=prod PORT=8008 #postgres DB_NAME=xxx DB_USER=xxx DB_HOST=xxx DB_PASSWORD=xxxx DB_PORT=5432 POSTGRES_PASSWORD=mysecretpassword #WSGI WSGI_PORT=8008 WSGI_WORKERS=4 WSGI_LOG_LEVEL=debug # Celery CELERY_NUM_WORKERS=2 # Email EMAIL_HOST_USER=xxxx EMAIL_HOST_PASSWORD=xxxxdocker-compose.yml
version: '3' services: backend: build: ./ container_name: site_container restart: always command: ./commands/start_server.sh ports: - "${PORT}:${WSGI_PORT}" volumes: - ./src:/srv/project/src - ./commands:/srv/project/commands - static_content:/var/www/site env_file: - .env depends_on: - postgres postgres: image: postgres:12 volumes: - pg_data:/var/lib/postgresql/data env_file: - .env # environment: # - DJANGO_SETTINGS_MODULE=app.settings.${MODE} nginx: image: nginx:1.19 volumes: - ./nginx:/etc/nginx/conf.d - static_content:/var/www/site ports: - 81:80 - 444:443 env_file: - .env depends_on: - backend volumes: pg_data: {} static_content: {}predeterminado.conf
server { listen 80 default_server; server_name 183.22.332.12; location /static/ { root /var/www/site; } location /media/ { root /var/www/site; } location / { proxy_set_header Host $host; proxy_pass http://backend:8010; } }default.conf para el primer sitio
server { #listen 80 default_server; listen 443 ssl http2; listen [::]:443 ssl http2; server_name site1 ip_site1; ssl_certificate /etc/letsencrypt/live/site1/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/site1/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/site1/chain.pem; location /static/ { root /var/www/artads; } location /media/ { root /var/www/artads; } location / { proxy_set_header Host $host; proxy_pass http://backend:8008; } } server { listen 80 default_server; server_name ip_site2 site2; location /static/ { root /var/www/gdr_mr; } location /media/ { root /var/www/gdr_mr; } location / { proxy_set_header Host $host; proxy_pass http://backend:8013; } } server { listen 80; listen [::]:80; server_name www.site1 site1; location / { return 301 https://site1$request_uri; } }Si está ejecutando dos servidores virtuales con diferentes IP en la misma máquina, querrá especificar la dirección IP en la directiva de escucha:
server { listen 192.168.1.1:80; server_name example.net www.example.net; ... } server { listen 192.168.1.2:80; server_name example.com www.example.com; ... } Puede encontrar más información sobre cómo nginx procesa las solicitudes aquí: http://nginx.org/en/docs/http/request_processing.html
Si desea ejecutar más de un sitio en un servidor, puede
ip diferenteport diferentedomain diferentePuede elegir uno de los mejores consejos de la lista.
En su configuración, elige una IP diferente y el mismo puerto, pero configura todo el sitio por defecto y no escucha la IP diferente
server{ listen ip:port; }Por lo general, IP simplemente se omite.
O puede una ip y un puerto diferente.
server{ listen port1; } server{ listen port2; }O puede una ip y un puerto pero un dominio diferente.
server{ listen port; server_name 1.a.com; } server{ listen port; server_name 2.a.com; }Gracias a @Roman Tokaren y @Oleksandr
Aquí la versión traducida al inglés enviada por @Roman Tokaren aquí
Siempre se puede discutir mucho sobre el lanzamiento "correcto"; después de todo, cuántas personas, tantas opiniones, pero describiré un ejemplo + - de una configuración "conveniente" y escalable. Por la "conveniencia" de trabajar en una configuración de este tipo, sugeriría instalar nginxproxymanager como un proxy inverso y combinar contenedores y nginxproxymanager en una sola red, después de lo cual será posible reenviar puertos de contenedores a través de http (s), tcp, udp a una interfaz externa que utiliza la GUI, así como una serie de otras ventajas, como la generación de certificados SSL y su renovación automática
Primero, creemos la red en sí.
docker network create --driver bridge --subnet 172.26.0.0/24 testnetConfiguremos NPM ( nginxproxymanager ) - por defecto consideraremos el proxy inverso como el último nodo de red, como resultado obtendremos
version: "3" services: app: image: 'jc21/nginx-proxy-manager:latest' networks: testnet: ipv4_address: 172.26.0.254 restart: always ports: # Public HTTP Port: - '80:80' # Public HTTPS Port: - '443:443' # Admin Web Port: - '81:81' environment: # These are the settings to access your db DB_MYSQL_HOST: "172.26.0.253" DB_MYSQL_PORT: 3306 DB_MYSQL_USER: "user" DB_MYSQL_PASSWORD: "pwd" DB_MYSQL_NAME: "npm" volumes: - ./data/nginx-proxy-manager:/data - ./letsencrypt:/etc/letsencrypt depends_on: - db db: image: yobasystems/alpine-mariadb:latest restart: always networks: testnet: ipv4_address: 172.26.0.253 environment: MYSQL_ROOT_PASSWORD: "pwd" MYSQL_DATABASE: "npm" MYSQL_USER: "user" MYSQL_PASSWORD: "pwd" volumes: - ./data/mariadb:/var/lib/mysql networks: testnet: external: trueY configurar el propio contenedor.
version: '3' services: backend: build: ./ container_name: site_container restart: always command: ./commands/start_server.sh networks: testnet: ipv4_address: 172.26.0.2 volumes: - ./src:/srv/project/src - ./commands:/srv/project/commands - static_content:/var/www/site env_file: - .env depends_on: - postgres postgres: image: postgres:12 volumes: - pg_data:/var/lib/postgresql/data env_file: - .env # environment: # - DJANGO_SETTINGS_MODULE=app.settings.${MODE} networks: testnet: external: true volumes: pg_data: {} static_content: {}Después de eso, llevamos a cabo la configuración inicial de NPM de acuerdo con las instrucciones y agregamos el host
