做网站备案的问题/信息流优化师怎么入行
Nginx 配置反向代理和负载均衡
前言
这段时间在重新搞自己阿里云服务器上的博客,想着使用docker来搞一下方便后期“移植”,所以也顺带玩了一下nginx(我自己服务器实际上是用不到nginx的,只是这里纯属放假因为疫情出不去没事干搞着玩。。。)
摘要
本文主要内容
1 docker下安装nginx、配置nginx挂载;
2 nginx 配置反向代理
3 nginx 配置负载均衡
4 nginx 一些原理参数理解。
注意:
1 本文不再复述docker的安装和配置等。详情请参考 Docker的安装配置以及IDEA的Docker插件使用
2 本文记录内容基于centos7系统进行操作
1 docker下安装配置nginx
基于上一篇关于docker 的文章已经介绍过了相关镜像的拉取和容器的创建运行,这里会相对比较简单的介绍,只对nginx的挂在做详细记录
1.2 nginx的安装
nginx的镜像拉取请参考摘要中链接
1.3 nginx创建挂载
docker安装的nginx有一个缺点就是我们后期想要更改配置比较麻烦,因为docker创建的nginx目录比较深 盖起来相当麻烦
如下图
为了后期更改方便我们一般需要给nginx创建挂载
挂载其实就是将nginx目录中的配置文件日志文件等映射出来,我们只需要更改映射出来的文件就会同步刷新docker中的nginx配置
1.3.1 创建映射目录
注意:
如果你使用的是最新版的nginx你的映目录中必须得有一个conf.d目录,因为在这个目录中有一个default.conf文件是我们后期配置的主要文件
# nginx.conf 文件映射目录
mkdir -p /docker/nginx_master/data/nginx/conf
# default.conf 文件映射目录
mkdir -p /docker/nginx_master/data/nginx/conf.d
# 日志文件映射目录
mkdir -p /docker/nginx_master/data/nginx/log
# html静态文件等映射目录
mkdir -p /docker/nginx_master/data/nginx/html
1.3.2 映射目录中创建对应文件
1.3.1步骤中已经创建了挂载目录接下来为每一个挂载目录中创建对应的挂载文件(log中除外)
建议:
我们最好先创建一个nginx容器并找到该容其中指定目录的文件复制到我们的挂载目录中,这样能够避免不同版本的nginx出现问题。(我就是采用的这种方式),html 和 log 中的文件不需要复制,因为这些文件相对来说不那么重要。
find . -name nginx.conf
find . -name default.conf
/docker/nginx_master/data/nginx/conf/nginx.conf 内容如下
user nginx;# 全局块 处理并发数的配置 worker 数和服务器的 cpu 数相等是最为适宜的
worker_processes auto;error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;# 影响nginx服务器与用户的网络连接数
events {worker_connections 1024; # 支持最大的连接数为1024
}# http块
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;
/docker/nginx_master/data/nginx/conf.d/default.conf 内容如下
# server块
server {listen 80; # 监听端口server_name localhost; # nginx服务器地址#access_log /var/log/nginx/host.access.log main;location / {root /usr/share/nginx/html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}
}
/docker/nginx_master/data/nginx/html/index.html 内容如下
<!DOCCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<h2> Hello Nginx!!! </h2>
</body>
</html>
1.3.3 创建挂载并启动nginx容器
注意:
不要换行, 最后的nginx是nginx镜像
docker run --name nginx-container -d -p 80:80 -v /docker/nginx_master/data/nginx/log:/var/log/nginx -v /docker/nginx_master/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /docker/nginx_master/data/nginx/conf.d:/etc/nginx/conf.d -v /docker/nginx_master/data/nginx/html:/usr/share/nginx/html nginx
执行后查看容器启动状态如下
设置容器自启,并重启容器
docker update --restart=always nginx-container
docker restart nginx-container
1.3.4 验证是不是挂载成功
我们之前已经创建了一个html文件,如果挂载成功我们访问nginx会自动访问我们创建的index.html文件,并且我们的log目录中一定会有日志文件生成
2 nginx配置反向代理
nginx配置反向代理可能的前段开发者经常遇到的问题,特别是前后端分离的情况下,一般会在前段服务器中利用nginx配置反向代理来解决跨域问题。接下来我们通过两台虚拟机来简单演示一下反向代理的配置。
现在假定目前使用的虚拟机为master虚拟机 IP:192.168.50.130
我们先在master虚拟机中安装在拉取一个tomcat的镜像创建并运行容器,启动tomcat
并在地址栏中输入192.168.50.130:8080查看页面效果看是否安装成功;
2.1 解决不能访问tomcat的问题
如果浏览器中输入ip和端口没有出现tomcat页面,你需要考虑以下几点问题:
1 8080端口是否放行
2 容器是否启动成功
3 webapps目录下是否存在默认的tomcat页面
第一二问题请参考前言中链接自行解决.
接下来简单解决一下第三种情况:
首先进入到tomcat容器内部
docker exec -it [容器Id或者容器名] /bin/bash
查看webapps中是否存在文件和文件夹等
我这里已经存在了:因为我已经解决过了
如果没有我们的解决办法:
首先军入到webapps目录内部 然后将webapps.dist目录中的内容copy进来即可
cp -r ../webapps.dist/* ./
重启tomcat容器再次访问即可.
2.2 反向代理正式配置
注意:
配置中先不去介绍每一块到底有什么作用,毕竟不是运维人员,不需要了解这么深入,但是后面我会单独列出一个章节简单介绍一些nginx的配置文件中的一些代码块的作用和原理
master虚拟机上面nginx和tomcat都已经安装完毕并运行起来了,那么我们只需要复制一个master虚拟机重新命名为backup这样就有了两台一模一样的虚拟机,我们就不需要麻烦再去创建一个新的虚拟机了.
这里的backup 虚拟机的IP为:192.168.50.131
我们访问192.168.50.131:8080 同样可以看到tomcat正常访问.
2.2.1 配置访问master跳转到backup的tomcat
先来简单配置一个反向代理的实例,我们配置在地址栏输入
http://192.168.50.130 直接访问backup虚拟机的tomcat
这里的配置我直接使用 FileZilla Client 这款工具直接修改配置文件
我们在default.conf配置文件中修改内容如下:
# server块
server {listen 80; # 监听端口server_name 192.168.50.130; # nginx服务器地址location / {proxy_pass http://192.168.50.131:8080;# root /usr/share/nginx/html;# index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
保存后重启nginx容器访问 http://192.168.50.130 看效果如下
可以看到我们访问master服务器的ip地址,直接跳转到了backup的tomcat中
2.2.2 反向代理配置正则匹配到不同的服务器上
我们通过配置nginx的匹配路径实现,用户输入不同的url后缀跳转到不同的服务器上.
例如:
访问 http://192.168.50.130/test131/131.html 反向代理到backup服务器上的131.html
访问 http://192.168.50.130/130test/130.html 反向代理到master服务器上的130.html
首先我们需要先在master服务器和backup服务器上的tomcat中分别创建html文件
如何在tomcat容器中创建文件就不再详述了 因为重点不是这里,自己想办法解决,你可以先找到tomcat容器的webapps目录,然后进行创建.
master中创建/130test/130.html 内容如下
<h1>192.168.50.130 tomcat running !!! <h1/>
backup中创建/test131/131.html 内容如下
<h1>192.168.50.131 tomcat running !!!<h1/>
修改default.conf配置文件如下
[~ /xxx/] 这种路径配置就是正则,nginx会根据你输入的路径中是否包含此内容来匹配要代理到哪一个服务器
# server块
server {listen 80; # 监听端口server_name 192.168.50.130; # nginx服务器地址#access_log /var/log/nginx/host.access.log main;location / {# proxy_pass http://192.168.50.131:8080;root /usr/share/nginx/html;index index.html index.htm;}##### 这里测试反向代理###### 正则匹配backup路径的请求location ~ /test131/ {# 代理到指定服务器地址和端口(这里的地址另一个虚拟机中的tomcat)proxy_pass http://192.168.50.131:8080;}# 正则匹配master路径的请求location ~ /130test/ {# 代理到指定服务器地址和端口(这里的地址是本机tomcat)proxy_pass http://192.168.50.130:8080;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}
重启nginx容器 分别访问如下路径查看效果:
http://192.168.50.130/test131/131.html
http://192.168.50.130/130test/130.html
3 nginx 配置负载均衡
负载均衡能有效解决微服务下多台服务器压力过大问题.这也是我们使用nginx很重要的一个原因.
我们在nginx.conf中直接配置如下内容:
其中upstream 就是负载代码块 myserver 随便命名只要不冲突即可,
可以看到负载均衡又下面四种策略,每一种策略都需要使用者根据不同需求而定
user nginx;# 全局块 处理并发数的配置 worker 数和服务器的 cpu 数相等是最为适宜的
worker_processes auto;error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;# 影响nginx服务器与用户的网络连接数
events {worker_connections 1024; # 支持最大的连接数为1024
}# http块
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;# 配置负载均衡 方案一:轮询 (一个接一个访问)upstream myserver{server 192.168.50.130:8080;server 192.168.50.131:8080;}# 配置负载均衡 方案二:weight (权重 数值越大,访问的频率越大) # upstream myserver{# server 192.168.50.130:8080 weight=10;# server 192.168.50.131:8080 weight=5;# }# 配置负载均衡 方案三:ip_hash (哈希 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题) # upstream myserver{# ip_hash;# server 192.168.50.130:8080;# server 192.168.50.131:8080;# }# 配置负载均衡 方案四:fair (第三方 按后端服务器的响应时间来分配请求,响应时间短的优先分配) # upstream myserver{# fair;# server 192.168.50.130:8080;# server 192.168.50.131:8080;# }include /etc/nginx/conf.d/*.conf;
}
在default.conf配置文件中配置
# server块
server {listen 80; # 监听端口server_name 192.168.50.130; # nginx服务器地址location / {# proxy_pass http://192.168.50.131:8080;proxy_pass http://myserver;root /usr/share/nginx/html;index index.html index.htm;}##### 这里测试反向代理###### 正则匹配backup01路径的请求# location ~ /test131/ {# # 代理到指定服务器地址和端口(这里的地址另一个虚拟机中的tomcat)# proxy_pass http://192.168.50.131:8080;# }# 正则匹配master路径的请求# location ~ /130test/ {# # 代理到指定服务器地址和端口(这里的地址是本机tomcat)# proxy_pass http://192.168.50.130:8080;# }error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}
注意这里省略了一些东西:
我已经在master 和 backup 服务器的tomcat中都创建了名为 /test131/131.html的文件
如果你没有创建可以参考上面个方式自行创建这里不再复述
重启nginx容器多次访问如下地址查看效果:
可以看到确实如上面配置使用了轮询的方式访问不同的服务器.
http://192.168.50.130/test131/131.html
其他几种方式不再演示,至此负载均衡的配置原理也已经结束.
4 nginx的一些代码块和原理记录
经过上面配置我们已经配置了反向代理和负载均衡,当然还有一些动静分离 以及高可用 没有进行配置.
这里简单介绍一下nginx配置文件中一些关键字的作用和原理
4.1 master 和 worker
# 我们在nginx.conf 配置文件中可以看到worker_processes auto; #全局块 处理并发数的配置 worker 数和服务器的 cpu 数相等是最为合适# nginx是基于master 和 worker 机制运行的
# 也就是nginx中的master进程下有很多worker进程,这些worker进程相互独立,当一个worker中断了不会影响其他worker进程的运行工作.
4.2 worker_connections
#影响nginx服务器与用户的网络连接数
events {worker_connections 1024; # 支持最大的连接数为1024 表示每个 worker 进程所能建立连接的最大值
}
4.3 如何计算最大并发数
第一个:发送请求,占用了 woker 的几个连接数?
答案:2 或者 4 个
这是因为如果访问的静态资源nginx访问之后会直接展示了,不会返回给代理服务器所以是2个,
如果反向代理访问的动态资源资源服务器还需要建立连接返回给代理服务器响应数据所以是4个第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的
最大并发数是多少?普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4
5 结束语
本次简单记录一些自己这两天闲着没事干在家搞自己阿里云服务器时 查阅资料时整理的一些笔记
当然nginx的功能远远不止这些,你还可配置nginx动静分离和nginx高可用以及配置防盗链,URL过滤等骚操作,
因为时间原因这里没有去配置这些东西,网上资料一大堆,这里后期有时间再完善吧…
目前个人博客已经使用docker进行部署,后期有什么问题再进行修改吧…emo…
好了 就这些吧 …