1. docker 部署 nginx
-
从 Docker Hub 搜索 nginx 的镜像文件,使用如下命令拉取镜像
// 拉取 1.21.0 版本 docker pull nginx:1.21.0 // 默认拉取 latest 最新版本 docker pull nginx
-
本机创建文件夹,用于映射取代容器目录或文件,读者自行创建即可。因为容器实际是个精简的 Linux 系统,内部可能什么工具都没有安装,进入容器内部修改配置文件很不方便
- 笔者使用命令
sudo mkdir -p /Users/nathan/tool/docker_nginx/conf /Users/nathan/tool/docker_nginx/logs
创建两个本地文件夹- 创建一个日志文件夹
/Users/nathan/tool/docker_nginx/logs
用于保存 nginx 运行日志,不然只能进入容器查看 - 创建一个配置文件夹
/Users/nathan/tool/docker_nginx/conf
用于保存 nginx 配置文件
- 创建一个日志文件夹
- 使用命令
sudo vim /Users/nathan/tool/docker_nginx/conf/nginx.conf
创建nginx.conf
配置文件取代容器内 nginx 文件,该文件内容如下。注意,配置文件修改后需要重启容器才能生效
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; #读取指定文件夹下所有配置文件 include /etc/nginx/conf.d/*.conf; #定义 dev 集群 upstream dev { # 指定集群各个服务器节点 IP 端口及权重 server 172.10.217.29:20561 weight = 100; server 172.10.217.29:20561 weight = 100; } server { # 指定监听 80 端口 listen 80; charset utf-8; # 对外域名,可配置多个,空格隔开,也可使用通配符 server_name nathan.com; location / { # 实际映射的后端服务器 proxy_pass http://dev; proxy_redirect default; } } }
- 笔者使用命令
-
使用
docker run
命令创建一个 nginx 容器并启动,该命令的重点如下-d
设置容器后台运行
-p
本机:容器端口映射, 将本地的80端口映射到容器内部的80端口,并显式指定传输协议
--name
容器命名,需保持唯一
-v
本机:容器映射目录,此处使用步骤2 创建的文件目录,/etc/nginx/nginx.conf
为容器内部 nginx 默认配置文件
命令最后一个nginx:1.21.0
是使用的镜像的名称docker run -d -p 80:80/tcp --name nginx-web -v /Users/nathan/tool/docker_nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /Users/nathan/tool/docker_nginx/logs:/var/log/nginx nginx:1.21.0
-
容器启动后,可通过
docker ps
命令查看已经启动的容器列表CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb6194c61657 nginx:1.21.0 "/docker-entrypoint.…" 3 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-web
-
通过
docker exec
命令可进入容器内,也就是进入这个只运行了 nginx 的 Linux 系统内部, nginx 安装目录为/etc/nginx
// 通过容器名称开启一个交互模式的终端 docker exec -it nginx-web /bin/sh // 通过容器id开启一个交互模式的终端 docker exec -it eb6194c61657 /bin/sh
nginx 四层负载均衡配置
Nginx 1.9 版本增加了Stream 模块,支持四层负载均衡,一个示例的四层负载均衡 nginx.conf
配置文件如下所示
events {
worker_connections 1024;
}
stream {
upstream mserver {
server 10.129.39.88:7090;
server 10.129.39.88:7091;
}
log_format proxy '$remote_addr $remote_port - [$time_local] $status $protocol '
'"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"';
access_log /var/log/nginx/proxy.log proxy;
server {
listen 80;
proxy_pass mserver;
proxy_connect_timeout 1s;
proxy_timeout 3s;
}
}
2. nginx 反向代理配置
例如在浏览器上访问 http://nathan.com/hello
,没有带上端口号,其实相当于访问 http://nathan.com:80/hello
,此时要将请求转发到 nginx,再由 nginx 转发给实际处理的机器需要经历下图过程,配置步骤如下
-
HTTP 请求发出,首先要做的就是解析域名
nathan.com
获得对应的 IP。因为想将请求打进 nginx,故需配置本地 host 文件,将域名nathan.com
指向 nginx 所在的服务器。如果通过 docker 将 nginx 部署在本地,Mac/Linux 系统下可打开终端使用命令sudo vim /etc/hosts
添加以下内容// 需注意 DNS 会有缓存,修改 Host 后可能会几分钟之后才能生效 127.0.0.1 nathan.com
-
经过域名解析,HTTP 请求发到本机 80 端口。nginx 容器启动时绑定了宿主机 80 端口,则请求进入 nginx 反向代理
-
nginx 转发的规则都写在 nginx 的配置文件中,处理
http://nathan.com
请求时会查找server_name
能够匹配nathan.com
的server 节点
,接着根据proxy_pass
将请求转发到对应的 HTTP 路径。proxy_pass
可指定单个 URL,也可以引用upstream
定义的集群,将请求按照负载均衡策略转发到对应节点。相关配置可参考上一节步骤2nginx.conf
文件