Docker Nginx HTTPS二级域名无端口访问多个Web项目全攻略
在当今的Web开发环境中,将多个Web项目部署在同一服务器上,并通过不同的二级域名(如project1.example.com、project2.example.com)进行无端口访问,同时保证HTTPS安全通信,已成为许多开发者和企业的需求。本文将详细介绍如何使用Docker和Nginx实现这一目标,为读者提供一套完整的解决方案。
一、环境准备
1.1 安装Docker与Docker Compose
首先,确保你的服务器上已安装Docker和Docker Compose。Docker提供了轻量级的容器化技术,而Docker Compose则简化了多容器应用的部署与管理。
- 安装Docker:根据操作系统(如Ubuntu、CentOS等)的官方文档进行安装。
- 安装Docker Compose:通常可以通过包管理器(如
apt、yum)或直接从GitHub下载二进制文件进行安装。
1.2 准备Web项目
准备两个或多个Web项目,可以是静态网站、Node.js应用、Python Flask/Django应用等。确保每个项目都能独立运行,并监听不同的端口(如3000、3001等)。
二、生成HTTPS证书
为了实现HTTPS访问,我们需要为每个二级域名生成SSL/TLS证书。这里推荐使用Let’s Encrypt提供的免费证书服务。
2.1 安装Certbot
Certbot是Let’s Encrypt官方推荐的客户端工具,用于自动化证书的申请与更新。
# Ubuntu示例sudo apt updatesudo apt install certbot python3-certbot-nginx
2.2 申请证书
使用Certbot为每个二级域名申请证书。假设你的域名是example.com,需要为project1.example.com和project2.example.com申请证书。
# 为project1.example.com申请证书sudo certbot certonly --nginx -d project1.example.com# 为project2.example.com申请证书sudo certbot certonly --nginx -d project2.example.com
申请过程中,Certbot会要求你提供邮箱地址以接收证书过期提醒,并同意服务条款。
三、配置Nginx与Docker
3.1 创建Nginx配置文件
为每个二级域名创建独立的Nginx配置文件。以project1.example.com为例:
# /etc/nginx/conf.d/project1.confserver {listen 80;server_name project1.example.com;return 301 https://$host$request_uri;}server {listen 443 ssl;server_name project1.example.com;ssl_certificate /etc/letsencrypt/live/project1.example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/project1.example.com/privkey.pem;location / {proxy_pass http://project1_app:3000; # 假设project1运行在容器内的3000端口proxy_set_header Host $host;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;}}
同理,为project2.example.com创建类似的配置文件,只需修改server_name、ssl_certificate、ssl_certificate_key和proxy_pass等字段。
3.2 编写Docker Compose文件
使用Docker Compose来管理多个Web项目的容器。以下是一个示例docker-compose.yml文件:
version: '3'services:project1_app:image: your_project1_image # 替换为你的项目镜像ports:- "3000:3000" # 仅用于调试,实际生产中应通过Nginx反向代理访问# 其他配置...project2_app:image: your_project2_image # 替换为你的项目镜像ports:- "3001:3001" # 同上# 其他配置...nginx:image: nginx:latestports:- "80:80"- "443:443"volumes:- /etc/nginx/conf.d:/etc/nginx/conf.d # 挂载Nginx配置文件目录- /etc/letsencrypt:/etc/letsencrypt # 挂载证书目录depends_on:- project1_app- project2_app
3.3 启动容器
在docker-compose.yml文件所在目录下执行以下命令启动容器:
docker-compose up -d
这将后台启动所有定义的容器。
四、验证与测试
4.1 验证Nginx配置
执行以下命令检查Nginx配置是否正确:
sudo nginx -t
4.2 访问Web项目
在浏览器中分别访问https://project1.example.com和https://project2.example.com,确认能够正常访问且显示为HTTPS安全连接。
五、高级配置与优化
5.1 自动更新证书
Let’s Encrypt证书的有效期为90天,建议设置自动更新。可以使用Certbot的定时任务功能:
sudo certbot renew --dry-run # 先进行干跑测试# 如果测试通过,可以设置定时任务echo "0 3 * * * /usr/bin/certbot renew --quiet" | sudo tee -a /etc/crontab
5.2 负载均衡与高可用
对于高流量网站,可以考虑在Nginx中配置负载均衡,将请求分发到多个后端服务器。此外,还可以使用Docker Swarm或Kubernetes等容器编排工具实现高可用部署。
5.3 安全加固
- 定期更新Docker和Nginx到最新版本,以修复已知的安全漏洞。
- 限制Nginx的访问日志,避免记录敏感信息。
- 使用防火墙规则限制不必要的端口访问。
六、总结
通过本文的介绍,我们学习了如何使用Docker和Nginx实现HTTPS二级域名无端口访问多个Web项目。从环境准备、证书生成、Nginx配置到Docker Compose部署,每一步都至关重要。希望本文能为开发者提供一套实用的解决方案,助力高效部署与管理Web应用。