【保姆级教程】Docker部署Nginx,反向代理+静态文件服务器(服务器版)
大家好,我是Goya!
今天是Docker部署系列的第三篇文章:用Docker部署Nginx。
Nginx是用途最广的Web服务器,主要有三个场景:
-
📄 静态文件服务器:部署前端Vue/React打包后的页面
-
🔀 反向代理:把请求转发给后端的Node.js/Java服务
-
🔒 配置HTTPS:给网站加个小锁
本篇要点:
-
✅ 一分钟启动Nginx容器
-
✅ 配置静态文件服务
-
✅ 设置反向代理转发API请求
-
✅ 配置文件挂载和热加载
-
✅ 日志查看和管理
-
✅ 解决端口冲突问题
一、准备工作
1.1 检查Docker环境
docker --version
1.2 拉取Nginx镜像
docker pull nginx:latest
查看镜像:
docker images | grep nginx
二、创建挂载目录
我们需要三个目录来存放Nginx的配置和文件:
# 创建nginx相关目录
mkdir -p ~/docker/nginx/{html,conf.d,logs}
目录说明:
-
html:存放静态网页文件(index.html等)
-
conf.d:存放站点配置文件(default.conf)
-
logs:存放访问日志和错误日志
三、准备测试页面
创建一个漂亮的测试页面,用来验证静态文件服务:
cat > ~/docker/nginx/html/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<title>Docker Nginx 部署成功</title>
<meta charset="utf-8">
<style>
body {
font-family: 'Microsoft YaHei', sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
text-align: center;
padding: 100px;
}
h1 { font-size: 48px; margin-bottom: 20px; }
p { font-size: 18px; opacity: 0.9; }
.info {
background: rgba(255,255,255,0.2);
border-radius: 10px;
padding: 20px;
margin-top: 40px;
}
</style>
</head>
<body>
<h1>🎉 Nginx Docker 部署成功!</h1>
<p>这是通过Docker运行的Nginx静态页面</p>
<div class="info">
<p>服务器时间:<span id="time"></span></p>
<p>容器内路径:/usr/share/nginx/html</p>
<p>宿主机路径:~/docker/nginx/html</p>
</div>
<script>
document.getElementById('time').innerText = new Date().toLocaleString('zh-CN');
</script>
</body>
</html>
EOF
四、配置Nginx
创建站点配置文件,同时配置静态文件服务和反向代理:
vim ~/docker/nginx/conf.d/default.conf
粘贴以下内容:
server {
listen 80;
server_name localhost;
charset utf-8;
# 访问日志
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 静态文件服务
location / {
root /usr/share/nginx/html;
index index.html;
# 支持history路由模式(单页应用)
try_files $uri $uri/ /index.html;
}
# 反向代理:将/api/开头的请求转发到后端服务
location /api/ {
# 172.17.0.1 是Docker默认网关,容器通过它访问宿主机
proxy_pass http://172.17.0.1: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;
}
# 静态资源缓存设置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /usr/share/nginx/html;
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
配置说明:
-
location /:静态文件服务,指向html目录
-
location /api/:反向代理,把/api/开头的请求转发给本地3000端口
-
try_files:支持Vue/React的history路由模式
-
expires 30d:静态资源缓存30天
五、运行Nginx容器
5.1 关于端口选择的说明
常见问题:如果80端口被占用怎么办?
可以用 netstat -tlnp | grep 80 查看谁占了80端口。本文为了兼容性,我们使用8081端口演示,如果你服务器80端口空闲,可以直接用80端口。
5.2 启动Nginx容器
docker run -d \
--name nginx \
-p 8081:80 \
-v ~/docker/nginx/html:/usr/share/nginx/html \
-v ~/docker/nginx/conf.d:/etc/nginx/conf.d \
-v ~/docker/nginx/logs:/var/log/nginx \
--restart=always \
nginx:latest
命令解释:
| 参数 | 说明 |
|---|---|
-p 8081:80 | 宿主机8081端口映射到容器80端口 |
-v ~/docker/nginx/html:/usr/share/nginx/html | 挂载静态文件目录 |
-v ~/docker/nginx/conf.d:/etc/nginx/conf.d | 挂载站点配置目录 |
-v ~/docker/nginx/logs:/var/log/nginx | 挂载日志目录 |
--restart=always | 容器异常退出自动重启 |
5.3 验证容器运行
docker ps | grep nginx
应该能看到nginx容器,状态是Up。
六、验证静态文件服务
6.1 本地测试
curl localhost:8081
应该能看到HTML页面的内容。
6.2 浏览器访问
打开浏览器,访问:
http://你的服务器IP:8081
应该能看到漂亮的紫色渐变页面!
6.3 测试其他静态文件
# 创建几个测试文件
echo "<h1>页面1</h1>" > ~/docker/nginx/html/page1.html
echo "<h1>页面2</h1>" > ~/docker/nginx/html/page2.html
访问测试:
-
http://你的IP:8081/page1.html
-
http://你的IP:8081/page2.html
七、测试反向代理功能
7.1 启动测试后端服务
我们需要一个后端服务来测试反向代理。这里用Python启动一个简单的HTTP服务:
docker run -d \
--name test-api \
-p 3000:3000 \
python:3-alpine \
python -m http.server 3000
7.2 验证后端服务
curl localhost:3000
应该能看到目录列表的HTML输出。
7.3 通过Nginx访问后端
# 通过Nginx反向代理访问后端
curl localhost:8081/api/
应该看到和直接访问后端一样的结果,说明反向代理成功!
八、日志查看与管理
8.1 查看容器日志
# 查看Nginx容器日志
docker logs nginx
# 实时查看日志
docker logs -f nginx
8.2 查看挂载的日志文件
# 查看访问日志
tail -f ~/docker/nginx/logs/access.log
# 查看错误日志
tail -f ~/docker/nginx/logs/error.log
8.3 生成一些访问日志
新开一个终端执行:
# 访问几次产生日志
curl localhost:8081/
curl localhost:8081/page1.html
curl localhost:8081/api/
然后在日志终端就能看到记录。
九、配置热加载(修改配置不用重启容器)
9.1 修改配置
vim ~/docker/nginx/conf.d/default.conf
比如添加一个自定义响应头,在location /中添加:
nginx
add_header X-Server "Docker-Nginx";
9.2 测试配置文件语法
docker exec -it nginx nginx -t
看到syntax is ok说明配置正确。
9.3 热加载配置
docker exec -it nginx nginx -s reload
9.4 验证新配置生效
curl -I localhost:8081
应该能看到X-Server: Docker-Nginx这个响应头。
十、部署前端项目实战
如果你有打包好的前端项目(Vue/React),部署非常简单:
# 1. 本地打包
npm run build
# 2. 将dist目录上传到服务器
scp -r dist/* root@你的服务器IP:~/docker/nginx/html/
# 3. 重新加载Nginx(可选,Nginx会自动加载新文件)
docker exec -it nginx nginx -s reload
搞定!你的前端项目就部署上线了。
十一、常用命令速查
# 停止容器
docker stop nginx
# 启动容器
docker start nginx
# 重启容器
docker restart nginx
# 查看实时日志
docker logs -f nginx
# 进入容器
docker exec -it nginx bash
# 测试配置文件
docker exec -it nginx nginx -t
# 重新加载配置(不停机)
docker exec -it nginx nginx -s reload
# 删除容器(数据还在)
docker rm -f nginx
十二、常见问题排查
Q1:端口被占用怎么办?
# 查看谁占了端口
netstat -tlnp | grep 80
# 改用其他端口(比如8081)
# 修改 -p 8081:80 即可
Q2:修改配置后不生效?
# 测试配置文件语法
docker exec -it nginx nginx -t
# 重新加载配置(不用重启容器)
docker exec -it nginx nginx -s reload
Q3:403 Forbidden错误?
# 查看html目录权限
ls -la ~/docker/nginx/html
# 确保文件可读
chmod -R 755 ~/docker/nginx/html
Q4:反向代理报错"connection refused"
检查后端服务是否在运行:
# 查看后端容器
docker ps | grep test-api
# 测试直接访问后端
curl localhost:3000
Q5:访问日志看不到?
# 检查日志文件是否存在
ls -la ~/docker/nginx/logs/
# 手动创建(如果不存在)
touch ~/docker/nginx/logs/access.log
touch ~/docker/nginx/logs/error.log
十三、总结
通过本文,我们在服务器上成功实现了:
Nginx是Web服务的入口,掌握了它,你就可以:
以下为整理后的表格形式:
| 功能 | 是否实现 | 验证方法 |
|---|---|---|
| Docker部署Nginx | ✔️ | docker ps 看到容器 |
| 静态文件服务 | ✔️ | 浏览器访问首页 |
| 配置文件挂载 | ✔️ | 修改配置后生效 |
| 反向代理 | ✔️ | 通过/api/访问后端 |
| 日志挂载 | ✔️ | tail -f logs/access.log |
| 配置热加载 | ✔️ | 修改配置不重启 |
- 部署前端项目
- 配置多个站点
- 做负载均衡
- 配置HTTPS证书
如果本文对你有帮助,欢迎点赞、收藏、评论!
更多推荐
所有评论(0)