Nginx
Nginx
1 引言
为什么学习nginx?
问题1:客户端到底要讲请求发给哪台服务器
问题2:如果所有客户端的请求都发送给了服务器1,那么服务器1的处理压力会很大
问题3:客户端发送的请求可能是申请动态资源的,也有可能申请静态资源,最好是做一个动静分离

nginx可以根据一定的算法来选择服务器,同时对于一些静态资源如图片,css文件,html文件等资源,nginx自己就可以处理(nginx本身也是一个服务器,)
Nginx介绍
nginx是由一个俄罗斯人研发,应对Rambler网站,并且在2004年发行了第一个版本(这是作者)

nginx的特点:
- 稳定性极强。7*24小时不间断运行。
- Nginx提供了非常丰富的配置实例
- 占用内存小,并发能力强
tomcat仅仅支持150个(线程池只有150个)
也就是说tomcat最多就支持150个并发,nginx最多支5 w以上的并发
二、Nginx的安装
Docker compose的yml版文件
version:'3.1'
services:
nginx:
restart:always
image:daoclould.io/library/nginx:latest
container_name:nginx
ports:
-80:80
这里直接用狂神的安装方法其实也一样
执行
docker-compose up -d #运行docker compose
常见的docker compose命令
#重新构建容器
docker-compose bulid
#重新启动容器
docker-compose up -d
#退出容器
exit
#关闭容器
docker-compose down
nginx的配置文件
# 先用docker ps找到nginx的容器id
cjp@bogon ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
608fa11e8d00 tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:32768->8080/tcp tomcat-net-01
8a22ec7081a5 nginx "/docker-entrypoint.…" 10 days ago Up 7 minutes 0.0.0.0:3344->80/tcp nginx01
# 然后进入到nginx
docker exec -it 8a22ec7081a5 bash
# 然后找到nginx.conf文件
root@8a22ec7081a5:/# cd etc/nginx
root@8a22ec7081a5:/etc/nginx# ls
root@8a22ec7081a5:/etc/nginx# cat nginx.conf
#然后找到了nginx的核心配置文件
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# 以上统称为全局快,worker——process的数值越大,nginx的并发能力越强
# error——log代表nginx的错误日志存放的位置
events {
worker_connections 1024;
}
# events块
# worker——connections他的数值越大,nginx的并发能力越强
# http块
http {
include /etc/nginx/mime.types; # 代表引入外部文件-> mime.type存放着大量的媒体类型
default_type application/octet-stream;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf; # 引入了/etc/nginx/conf.d/目录下以.conf结尾的配置文件
}
# 下面查看/etc/nginx/conf.d/目录
root@8a22ec7081a5:/etc/nginx# cd
root@8a22ec7081a5:~# bash
root@8a22ec7081a5:~# cd /etc/nginx/conf.d/
root@8a22ec7081a5:/etc/nginx/conf.d# ls
default.conf
# 在这里发现了default.conf文件,下面查看default.conf
root@8a22ec7081a5:/etc/nginx/conf.d# cat default.conf
server {
listen 80; # nginx监听的端口号
listen [::]:80;
server_name localhost; # nginx接受请求的ip
location / {
root /usr/share/nginx/html; # 将接收到的请求根据/usr/share/nginx/html;去抄着静态资源
index index.html index.htm; # 默认从上述的路径中找到index.html或者index.html
}
# server块
}
其实后期主要就是修改server块的文件
2.3修改docker-compose文件
修改成这样
version:'3.1'
services:
nginx:
restart:always
image:daoclould.io/library/nginx:latest
container_name:nginx
ports:
-80:80
volumes:
- /Users/cjp/Desktop/docker/nginx_test/conf/:/etc/nginx/conf.d
# 然后重新构建一下
docker-compose build
#重新启动容器
docker-compose up -d
这个还是不能运行的,现在编写config文件
在/Users/cjp/Desktop/docker/nginx_test/conf/下新建default.conf并插入如下内容
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
#重启nginx
docker-compose restart
三、Nginx的反向代理
正向代理和反向代理
正向代理
- 正向代理服务器由客户端设立的
- 客户端了解代理服务器和目标服务器都是谁
- 帮助用户突破访问权限,提高访问速度,对目标服务器隐藏客户端的ip地址
国内直接访问谷歌是访问不到的,需要使用正向代理服务器,由正向代理服务器代替你访问谷歌

反向代理
- 反向代理服务器配置在服务端
- 客户端是不知道访问的是哪一台服务器
- 使用反向代理可以实现负载均衡,并且可以隐藏服务器真正的ip都做

3.2 机遇nginx实现反向代理
准备一个目标服务器
运行此命令
docker run -d -p 8080:8080 --name tomcat_nginx -v /Users/cjp/Desktop/docker/docker_compose/tomcat/webapps:/usr/local/tomcat/webapps -v /Users/cjp/Desktop/docker/docker_compose/tomcat/logs:/usr/local/tomcat/logs tomcat
tomcat运行成功,然后在webapps目录下面,创建一个初始页面
cd webapps
mkdir ROOT
cd ROOT
vi index.html
然后随便在html里面添加内容,就可以访问到页面了

下面让nginx负责转发
编写nginx配置文件
server {
listen 80;
listen [::]:80;
server_name localhost;
#基于反向代理访问Tomcat服务器
location / {
proxy_pass http://localhost:8080/;
}
# location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
# }
}
proxy_pass是动态资源转发
然后重新启动nginx
3.3关于nginx的location路径映射
优先级关系
(location =)> (location /xx/yy/zz) > (location ^~) > (location ~,location ~*) > (location /启始路径) > (location /)
匹配到上面就不会匹配到下面的了
1 精准匹配
# 1、 = 匹配
localton = / {
# 精准匹配:主机名后面不带任何字符串
}
2 通用匹配
# 2、 通用匹配
location /xx
# 匹配所有以/xx开头的路径
}
3 正则匹配
#3、 正则匹配
location ~/xx {
# 匹配所有以/xxx开头的路径
}
4 匹配开头路径
location ^~ /xxx/xx {
#匹配所有以/xxx/xx开头的路径
}
5
location ~* \.(gif/jpg/png)$ {
#匹配以.gif、.jpg或者.png结尾的路径
}

四、负载均衡
nginx默认提供了3种负载均衡策略
轮询:把请求顺着分配,平均分配给每一台服务器
权重:根据处理请求速度的比例来分配
ip_hash:请求的时候肯定会带着客户端的ip地址,如果ip不变,默认的会一直交给某一台服务器
编辑nginx
4.1轮询
把default.conf文件改为
upstream my-server{
server 192.168.0.5:8080;
server 192.168.0.7:8080;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://my-server/; #tomcat首页
}
}
就会发现每次访问localhost会出现不同的页面
格式
upstream 名字{
server ip:port;
server ip:port;
}
server {
listen 80;
server_name localhost;
}
location / {
proxy_pass http://upstream的名字/;
}
4.2 权重
只需要在upstream里面加点东西就可以了
这样改动的话每6个请求里面有一个会到192.168.0.7中
upstream my-server{
server 192.168.0.5:8080 weight=10;
server 192.168.0.7:8080 weight=2;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://my-server/; #tomcat首页
}
}
4.3 ip_hash
在upstream下面加ip_hash
只要客户端不变,就会一直是请求到的地址
upstream my-server{
ip_hash;
server 192.168.0.5:8080 weight=10;
server 192.168.0.7:8080 weight=2;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://my-server/; #tomcat首页
}
}
五 动静分离
nginx的并发能力公式
worker_processes * worker_connections / 4|2 = nginx最终的并发能力
动态资源需要除以4,静态资源需要除以2
Nginx通过动静分离,来提升Nginx的并发能力
也可以更快的给用户响应
这是动态资源的请求链路

这是静态资源的请求链路

5.1 动态资源代理
# 配置如下
location / {
proxy_pass 路径;
}
5.2 静态资源代理
# 配置如下
location / {
root 静态资源路径;
index 默认访问路径下的什么资源;
autoindex on; #代表展示静态资源的全部内容,以列表形式展开
}
静态资源其实就是在nginx里面,因此docker需要挂载一个数据卷,映射到nginx服务器的一个目录
修改compose
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx_compose_yml01
ports:
- 80:80
volumes:
- /Users/cjp/Desktop/docker/nginx_test/conf/:/etc/nginx/conf.d
- /Users/cjp/Desktop/docker/nginx_test/image/:/data/image
- /Users/cjp/Desktop/docker/nginx_test/html/:/data/html
修改配置文件
upstream my-server{
server 192.168.0.5:8080 weight=10;
server 192.168.0.7:8080 weight=2;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#代理到html静态资源
location /html {
root /data;
index index.html;
}
#代理到img静态资源
location /image{
root /data;
autoindex on;
}
#location / {
# proxy_pass http://my-server/; #tomcat首页
#}
}
六 nginx集群
使用集群可以防止服务器单点故障的问题
同时分散压力
如果担心nginx出现单点故障,可以搭建nginx集群
keepalived程序可以监听nginx运行是否运行正常
haproxy可以帮助客户端选择使用哪个nginx服务中
haproxy会提供一个虚拟端口路径

nginx集群搭建
准备多台Nginx
准备keepalived,监听nginx的健康情况
准备haproxy,提供一个虚拟的路径,统一的去接受用户的请求