使用docker compose实现简单的nginx反向代理
本次使用docker完成一个简单的nginx反向代理,实现负载均衡
共需要两个nginx容器和宿主机,保证宿主机安装了nginx就行
yum install -y nginx
1.首先安装docker,拉取nginx镜像,安装docker-compose,这里不赘述
2.编写docker-compose ,注意 我在compose中使用了自定义的网络,如果没有事先创建网络的话会报错 创建自定义网络命令:docker network create <网络名> 查看已有网络 docker network ls 或者 docker network list
version: "3.9"
services:
nginx_first:
build:
context: .
args:
- port_number=8080
image: nginx:first
ports:
- 8080:80
volumes: #要挂载的卷(可理解为与宿主机共享目录)
- .:/test
networks:
- nginx-balance
nginx_second:
build:
context: .
args:
- port_number=8081
image: nginx:second
ports:
- 8081:80
environment:
PORT_NUMBER: 8081
volumes: #要挂载的卷(可理解为与宿主机共享目录)
- .:/test
networks:
- nginx-balance
networks:
nginx-balance:
3.编写dockerfile
这里我用的dockerfile只是为了区别是否实现了反向代理,两个nginx容器中的index页面会显示自身的端口号,方便查看配置是否成功
# #dockerfile内容,为每个nginx容器设置主页,方便查看是否成功实现代理:
# FROM nginx:latest
# ADD . /test
# ARG port_number
# WORKDIR /test
# RUN echo $port_number > /usr/share/nginx/html/index.html
4.将dockerfile文件和compose.yml文件放在同一个目录下
修改宿主机的nginx配置,脚本文件内容如下
setenforce 0 #必须关闭selinux 重要,否则连接一定失败
yum install -y nginx #安装nginx
docker-compose up -d
#修改nginx配置文件 ,根据目录决定
sed -i "39i/upstream srv {" /etc/nginx/nginx.conf #srv可以随便取名,保证对应即可
sed -i "40i/server 192.168.135.144:8080 weight=1;" /etc/nginx/nginx.conf #配置宿主机的两个端口用于转发请求,weight为服务器权重,使用默认的轮询模式
sed -i "41i/server 192.168.135.144:8081 weight=1;}" /etc/nginx/nginx.conf
#添加location块,用于重写请求头
cat >> /etc/nginx/default.d/srv.conf <<EOF
location / {
proxy_pass http://srv;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header x-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
root /usr/share/nginx/html;
}
EOF
nginx -s reload
#测试转发是否成功
curl 192.168.135.144
访问页面,如果成功的话刷新页面会显示不同的端口号
5.遇到的问题
宿主机selinux一定要关闭!! 不然会阻止访问请求,导致一直404
docker创建容器时不能关闭防火墙,否则会创建失败,报错为找不到映射的端口?(记不清了,遇到了这个问题记得开启防火墙)
upsream要卸载http块里面,location最好写在nginx安装目录下的default.d/ 里面,取名无所谓,最好跟upstream的名称对应,防止混乱
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律