树莓派Docker容器启动遇443端口占用,Traefik与Nginx共存咨询
问题:宿主机Nginx与Docker化Django项目的路由共存配置
问题背景
我用树莓派搭建了家庭服务器,已经部署了带SSL的Nginx,运行静态站点和个人网站。近期通过cookie-cutter-django构建Docker化项目,启动时Traefik出现如下错误:
Error response from daemon: driver failed programming external connectivity on endpoint new_project-traefik-1 (4759d36b8b42f426d3e20b933661d8628b23e9bfbe7c5942c9ac9e8f1e616f69):
Error starting userland proxy: listen tcp4 0.0.0.0:443: bind: address already in use
执行sudo netstat -pna | grep 443和sudo lsof -i -P -n | grep 443后,确认宿主机Nginx进程占用了443端口。
我不确定已有宿主机Nginx的情况下是否仍需Traefik,尝试移除项目内Traefik和Nginx配置后出现504错误。现需解决宿主机Nginx与容器化项目共存,以及多域名多项目(容器/非容器)的路由配置问题。
相关配置
1. 树莓派宿主机Nginx sites-available配置
server { listen 443 ssl; listen [::]:443 ssl; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/nginx/ssl/new_project.crt; ssl_certificate_key /etc/nginx/ssl/new_project.key; root /var/www/html/new_project; index index.php index.html index.htm index.nginx-debian.html; server_name new_project.com *.new_project.com; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } location ~ /\.ht { deny all; } } server { listen 443 ssl; listen [::]:443 ssl; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/nginx/ssl/new_project.crt; ssl_certificate_key /etc/nginx/ssl/new_project.key; root /var/www/html/new_project_staging; index index.php index.html index.htm index.nginx-debian.html; server_name staging.new_project.com; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } location ~ /\.ht { deny all; } } # force to https server { listen 80; listen [::]:80; server_name new_project.com *.new_project.com; return 301 https://$host$request_uri; }
2. 项目中production.yml的Traefik配置
traefik: build: context: . dockerfile: ./compose/production/traefik/Dockerfile image: new_project_production_traefik depends_on: - django volumes: - production_traefik:/etc/traefik/acme ports: - "0.0.0.0:80:80" - "0.0.0.0:443:443" - "0.0.0.0:5555:5555"
3. 项目中traefik.yml配置
log: level: INFO entryPoints: web: # http address: ":80" http: redirections: entryPoint: to: web-secure web-secure: # https address: ":443" flower: address: ":5555" certificatesResolvers: letsencrypt: acme: email: "admin@new_project.com" storage: /etc/traefik/acme/acme.json httpChallenge: entryPoint: web http: routers: web-secure-router: rule: "Host(`new_project.com`) || Host(`www.new_project.com`)" entryPoints: - web-secure middlewares: - csrf service: django tls: certResolver: letsencrypt flower-secure-router: rule: "Host(`new_project.com`)" entryPoints: - flower service: flower tls: certResolver: letsencrypt web-media-router: rule: "(Host(`new_project.com`) || Host(`www.new_project.com`)) && PathPrefix(`/media/`)" entryPoints: - web-secure middlewares: - csrf service: django-media tls: certResolver: letsencrypt middlewares: csrf: headers: hostsProxyHeaders: ["X-CSRFToken"] services: django: loadBalancer: servers: - url: http://django:5000 flower: loadBalancer: servers: - url: http://flower:5555 django-media: loadBalancer: servers: - url: http://nginx:80 providers: file: filename: /etc/traefik/traefik.yml watch: true
4. 项目内的Nginx配置(容器内)
server { listen 80; server_name localhost; location /media/ { alias /usr/share/nginx/media/; } }
额外疑问
cookie-cutter-django自动生成的上述项目内Nginx配置是否必要?
内容的提问来源于stack exchange,提问作者jisoooh0202
相关产品推荐
相关产品推荐

