相关文章推荐
豁达的小马驹  ·  attributeerror: ...·  1 月前    · 
有情有义的啄木鸟  ·  Creating Temporary ...·  8 月前    · 
朝气蓬勃的油条  ·  什么是 Django? | IBM·  1 年前    · 
高大的大熊猫  ·  TS ...·  1 年前    · 

如何使用docker和nginx在同一个服务器上运行多个网站?

11 人关注

我试图在同一台服务器上用不同的ip运行两个django网站,出现了端口繁忙的错误,我修复了端口,但网站没有启动。请告诉我哪里出错了?IP正常,当我进入第二个IP时,我得到了重定向到第一个网站。所有的设置都是为第二个网站指定的。在最后,我加入了第一个网站的nginx设置

这是第二个docker-compose文件和它的设置。我将非常感谢您的帮助

.environment

#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=xxxx

docker-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: {}

default.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

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;
10 个评论
你说在Django上运行两个网站是什么意思? 你是否有两个前台使用同一个Django后台? 如果你能更好地解释你的情况,这将会有帮助。 另外,请给出你遇到的错误和可以工作的编译文件。
@NoamYizraeli 不,有两个不同的项目
@Oleksandr 看来你在8013和8008运行两个站点,你需要确保两个应用程序中的WSGI没有使用该端口。
你是否在同一个docker容器中运行两个django项目?
@ddfra 我有2个docker compose文件,docker网络对每个人都是一样的。
@AhmedAblak 这些端口是免费的,一切都能正常启动
嗨 @Oleksandr 你能不能提供 docker ps 的输出,并在每个应用容器内运行 lsof -i :8008 && lsof -i :8013 && lsof -i :80
@Oleksandr docker ps 看起来不错。请确认你在访问site2时是否收到任何Nginx错误。
看起来你的容器正在运行,docker-compose配置和nginx配置看起来没有问题(只要这能准确反映你的实际文件)。你确定你的django应用实际上暴露在正确的端口上吗?默认情况下,django会使用8000,但你在compose文件中指定的是8008。
如果有人需要答案,就在俄语版 ru.stackoverflow.com/questions/1329007/...
django
nginx
docker-compose
Oleksandr
Oleksandr
发布于 2021-09-14
3 个回答
Chandan
Chandan
发布于 2021-09-23
已采纳
0 人赞同

感谢@Roman Tokaren和@Oleksandr

这里是@Roman Tokaren提交的英文翻译版本

你总是可以对 "正确 "的启动方式争论不休--毕竟有多少人,有多少意见,但我将描述一个例子+--一个 "方便 "和可扩展的配置。为了在这样的配置中工作的 "方便",我建议安装 nginxproxymanager 作为反向代理,并将容器和 nginxproxymanager 合并到一个网络中 - 之后就可以使用GUI将容器端口通过http(s)、tcp、udp转发到外部接口,以及其他一些好处,例如生成SSL证书和自动更新

首先,让我们创建网络本身

docker network create --driver bridge --subnet 172.26.0.0/24 testnet

让我们来配置NPM(nginxproxymanager)--默认情况下,我们将把反向代理视为最后一个网络节点,结果我们将得到

version: "3"
services:
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
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: true

并配置容器本身

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: {}

之后,我们根据指示进行NPM的初始配置,并添加主机

rozbo
rozbo
发布于 2021-09-23
0 人赞同

如果你想在一个服务器上运行一个以上的网站,你可以

  • 使用不同的 ip
  • 使用不同的 port
  • domain 而用
  • 使用不同的路径并重写它

    你可以选择一个最重要的列表提示。

    在你的配置中,你选择了不同的IP和相同的端口,但你把所有的网站都设置为默认的,不听不同的IP。

    server{
          listen      ip:port;
    

    通常情况下,IP只是被省略了。

    或者你可以使用一个IP和不同的端口。

    server{
          listen      port1;
    
    server{
          listen      port2;
    

    或者你可以使用一个IP和一个端口,但不同的域。

    server{
          listen      port;
          server_name 1.a.com;
    
    server{
          listen      port;
          server_name 2.a.com;
    
  • hexbioc
    hexbioc
    发布于 2021-09-23
    0 人赞同

    如果你在同一台机器上运行两个不同IP的虚拟服务器,你会想在listen指令中指定IP地址。

    server {
        listen      192.168.1.1:80;
        server_name example.net www.example.net;
    server {
        listen      192.168.1.2:80;