You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2上Docker部署网站需加3000端口访问,求默认80端口访问方案

解决EC2上Docker项目80端口冲突及默认端口访问问题

问题根源

你的docker-compose.yml中三个服务同时映射了宿主机的80端口:

  • client服务映射80:3000
  • app服务映射80:9000
  • nginx服务映射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:3000
  • admin.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:35:08