咨询如何将域名指向Docker部署的Next.js+Nginx服务
域名指向Docker容器服务的完整配置指南
已完成的前置操作
- 路由器80端口已转发至Docker服务器IP
192.168.1.101 - Docker容器运行状态正常,端口映射情况:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cabb3c8fe03c nextjs-docker-pm2-nginx-master_nginx "/docker-entrypoint.…" 16 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nextjs-docker-pm2-nginx-master-nginx-1 ed27e0fd2f24 nextjs-docker-pm2-nginx-master_nextjs "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 3000/tcp nextjs-docker-pm2-nginx-master-nextjs-1
剩余配置步骤
1. 配置域名解析
- 公网正式域名:将域名的A记录指向你的服务器公网IP(注意不是内网
192.168.1.101) - 本地测试域名:在本地hosts文件添加映射:
192.168.1.101 local.DOMAIN.com.au
2. 修正Nginx配置中的域名
编辑Nginx配置文件default.conf,将所有local.DOMAIN.com.au替换为你的实际域名:
# Cache zone proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:10m inactive=7d use_temp_path=off; upstream nextjs { server nextjs:3000; } server { listen 80; server_name your-domain.com.au; # 替换为实际域名 server_tokens off; gzip on; gzip_proxied any; gzip_comp_level 4; gzip_types text/css application/javascript image/svg+xml; 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; location /.well-known/acme-challenge/ { root /var/www/certbot; } # BUILT ASSETS (E.G. JS BUNDLES) # Browser cache - max cache headers from Next.js as build id in url # Server cache - valid forever (cleared after cache "inactive" period) location /_next/static { proxy_cache STATIC; proxy_pass http://nextjs; } # STATIC ASSETS (E.G. IMAGES) # Browser cache - "no-cache" headers from Next.js as no build id in url # Server cache - refresh regularly in case of changes location /static { proxy_cache STATIC; proxy_ignore_headers Cache-Control; proxy_cache_valid 60m; proxy_pass http://nextjs; } # DYNAMIC ASSETS - NO CACHE location / { proxy_pass http://nextjs; proxy_buffering off; proxy_set_header X-Real-IP $remote_addr; } } server { listen 443 default_server ssl http2; server_name your-domain.com.au; # 替换为实际域名 ssl_certificate /etc/nginx/ssl/live/your-domain.com.au/fullchain.pem; # 替换为实际域名路径 ssl_certificate_key /etc/nginx/ssl/live/your-domain.com.au/privkey.pem; # 替换为实际域名路径 location /.well-known/acme-challenge/ { root /var/www/certbot; } # BUILT ASSETS (E.G. JS BUNDLES) # Browser cache - max cache headers from Next.js as build id in url # Server cache - valid forever (cleared after cache "inactive" period) location /_next/static { proxy_cache STATIC; proxy_pass http://nextjs; } # STATIC ASSETS (E.G. IMAGES) # Browser cache - "no-cache" headers from Next.js as no build id in url # Server cache - refresh regularly in case of changes location /static { proxy_cache STATIC; proxy_ignore_headers Cache-Control; proxy_cache_valid 60m; proxy_pass http://nextjs; } # DYNAMIC ASSETS - NO CACHE location / { proxy_pass http://nextjs; proxy_buffering off; proxy_set_header X-Real-IP $remote_addr; } }
3. 验证Docker服务网络连通性
Docker Compose默认会为所有服务创建同一网络,upstream nextjs { server nextjs:3000; }的配置可直接解析到Next.js容器。若需验证,可进入Nginx容器测试:
docker exec -it nextjs-docker-pm2-nginx-master-nginx-1 ping nextjs
4. 生成SSL证书(正式域名)
运行Certbot命令获取证书(替换为你的域名):
docker-compose run --rm certbot certonly --webroot -w /var/www/certbot -d your-domain.com.au
5. 重启Docker服务
修改配置后,重启Nginx容器生效:
docker-compose up -d --build nginx
6. 验证访问
- 本地测试:访问
http://local.DOMAIN.com.au(需配置hosts) - 公网测试:访问
https://your-domain.com.au(确保服务器防火墙开放80、443端口)
内容的提问来源于stack exchange,提问作者RussellHarrower
相关产品推荐
相关产品推荐

