EC2上Docker部署网站需加3000端口访问,求默认80端口访问方案
解决EC2上Docker项目80端口冲突及默认端口访问问题
问题根源
你的docker-compose.yml中三个服务同时映射了宿主机的80端口:
client服务映射80:3000app服务映射80:9000nginx服务映射80:80
同一端口只能被一个进程占用,这直接导致了端口冲突错误。正确的架构应该是让Nginx作为唯一的对外入口,统一暴露80/443端口,内部服务(client、app)仅在Docker网络内通信,无需映射到宿主机端口。
解决方案步骤
1. 修改docker-compose.yml配置
移除client和app服务的端口映射,保留Nginx作为对外代理入口:
version: '3' services: # Client container client: build: context: frontend dockerfile: Dockerfile container_name: client # 移除80端口映射,仅内部网络访问 volumes: - ./frontend:/var/www/frontend # Laravel App app: build: context: backend dockerfile: Dockerfile image: hakase-labs/laravel container_name: app restart: unless-stopped tty: true # 移除80端口映射,仅内部网络访问 environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www/backend volumes: - ./backend/php/local.ini:/usr/local/etc/php/conf.d/local.ini - ./backend:/var/www/backend depends_on: - db # SSL certbot: image: certbot/certbot:latest container_name: certbot volumes: - ./certbot/www/:/var/www/certbot/:rw - ./certbot/conf/:/etc/letsencrypt/:rw # Nginx Service nginx: image: nginx:alpine container_name: nginx restart: unless-stopped tty: true ports: # 对外暴露80端口,处理HTTP请求 - "80:80" - "443:443" # 保留81端口(如果需要单独访问后端可保留,否则可移除) - "81:81" volumes: - ./:/var/www - ./certbot/www:/var/www/certbot/:ro - ./certbot/conf:/etc/letsencrypt/:ro - ./nginx/config/default.conf:/etc/nginx/conf.d/default.conf - ./nginx/config/nginx.conf:/etc/nginx/nginx.conf depends_on: - app - client # MySQL Service db: image: mysql:5.7 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: ******* MYSQL_USER: ************** MYSQL_PASSWORD: ************** MYSQL_ROOT_PASSWORD: ************* volumes: - mysqldata:/var/lib/mysql/ # Volumes volumes: mysqldata: driver: local
2. 确认Nginx配置有效性
你的default.conf已经正确配置了反向代理逻辑:
mydomain.com的80端口请求会重定向到HTTPS,HTTPS请求代理到client:3000admin.mydomain.com的80端口请求重定向到HTTPS,HTTPS请求处理Laravel后端
如果需要直接通过HTTP(而非HTTPS)访问前端,可修改第一个server块的重定向规则,将return 301 https://$server_name$request_uri;替换为:
location / { proxy_pass http://client:3000; # 保留原有proxy_set_header等配置 proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 1m; proxy_connect_timeout 1m; # Websocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }
3. 清理冲突进程并重启服务
- 检查宿主机80端口是否被其他进程占用:
sudo lsof -i :80 # 或 sudo netstat -tulpn | grep :80
- 如果有系统自带的Nginx/Apache等进程,停止它们:
sudo systemctl stop nginx # 或 sudo systemctl stop httpd
- 重启Docker服务:
docker-compose down && docker-compose up -d --build
4. 验证访问
直接访问http://mydomain.com即可看到前端页面,http://admin.mydomain.com访问后端管理页面,无需添加端口号。
内容的提问来源于stack exchange,提问作者lxst
相关产品推荐
相关产品推荐

