0%

Nginx基础

基本概念

Nginx(engine x)是一个高性能的HTTP和反向代理Web服务器,占有内存少,并发处理能力强

Nginx默认端口号80,即Http协议默认的端口号,因此在访问nginx服务器时不需要再手动指定端口号

Nginx的用途

  • 反向代理

    • 正向代理:代理服务器为客户端提供服务,代替客户端访问服务器,返回数据给客户端
    • 反向代理:代理服务器为服务器提供服务,客户端发送数据后由代理服务器选择目标服务器进行数据传输,暴露代理服务器地址,隐藏了真实的服务器地址
  • 负载均衡

    在高并发的情景中,单个服务器可能不能满足处理业务的需要,这时通过增加服务器数量和配置反向代理服务器,用户直接访问反向代理服务器,由反向代理服务器根据实际情况将请求分发到多个服务器上,以减小服务器压力

  • 动静分离

    为了加快网站的解析速度,将静态页面和动态页面分别由不同的服务器进行解析,降低单个服务器的压力

负载均衡的策略

  1. 轮询:每个请求按照时间顺序分配到不同的服务器
  2. 权重:权重weight默认为1,根据权重产生不同比例的请求分配给各服务器
  3. ip_hash:用户之间采用分配模式,单用户一旦访问服务器成功之后就只能访问这一台确定的服务器。可以解决Session问题
  4. fair:根据后端服务器的响应时间来分配请求,响应时间短的优先分配

Nginx工作方式

通过查看进程可以看到,除了第三个ps进程,nginx进程分为master和worker两类进程

image-20210927172115657

工作结构:

image-20210927172231739

  • master负责管理和监控worker
  • 当新的请求来到,所有worker会争抢去处理请求

一个master和多个worker的优点:

  • 可以使用nginx -s reload热部署

    热部署时正在处理请求的worker继续工作,空闲的worker开始适配新规则,当worker处理完请求后再适配新规则

  • 每个worker是独立的进程,当某一worker出现问题,其他worker仍然可以继续工作

设置worker数量:一般worker数目和服务器的cpu核数相当最佳

worker工作占用的连接数

  • 如果访问本地的静态资源

    接收用户请求和返回数据共2个连接

  • 如果请求远程服务器

    接受用户请求和返回数据,给服务器发送请求和获取数据,共4个连接

如果共有4个worker,每个worker最大连接数为1024,支持的最大/最小并发数为?

根据上面的结论,最大并发数为所有用户都访问静态资源,即1024*4/2=2048

最小连接数为所有用户都访问远程服务器,nginx服务器作为反向代理,即1024*4/4=1024

开始Nginx

安装

需要的依赖:

  • pcre
  • openssl
  • zlib

为了方便安装,这里使用docker进行示例

1
docker run --name nginx -p 80:80 -v /root/conf/nginxconf:/etc/nginx/outside-conf -d nginx:1.20.1

这里我们在容器内部的配置文件同级目录下创建了一个挂载的目录,如果我们需要修改内部文件,就在这个挂载的目录中修改

这时访问服务器的80端口就能够看到nginx的欢迎页了

常用命令

不适用docker使用命令之前需要先进入/usr/local/nginx/sbin路径使用./nginx执行命令

如果使用docker环境变量已经自动配好

1
2
3
4
5
nginx -v #查看版本
nginx -s stop #快速停止nginx
nginx -s quit #正常停止
./nginx #启动nginx,因为关闭nginx之后指令就不能使用了,因此还是需要进入目录执行命令
nginx -s reload #重新加载

配置文件

docker中的路径为/etc/nginx

这里的配置文件分为三部分

  • 全局块:配置整体运行的指令
  • event块:配置nginx服务器与用户的访问配置
  • http块

新版server块已经被划分到/etc/nginx/conf.d路径下,可以在这里进行配置

配置实例

最简单的代理

安装Tomcat

1
docker run --name tomcat -p 8080:8080 -v /root/test:/usr/local/tomcat/webapps/test -d tomcat

我们直接运行的Tomcat容器的webapps目录下是没有内容的,为方便测试,可以将webapps.dist目录下的默认欢迎页复制到webapps目录

配置nginx

由于之前我们配置了挂载目录,因此可以在挂载目录中编辑容器内部的配置文件,在/etc/nginx将两个配置文件进行拷贝:

1
2
cp nginx.conf outside-conf/
cp conf.d/default.conf outside-conf/

在外部使用vim就可以进行编辑了

这里在default.conf修改两处

image-20210927145310743

这里不使用127.0.0.1,因为在容器里面配置环回IP相当于容器自己的IP,当然不会与另一个容器的IP相连通

配置完毕后,可以尝试访问服务器的80端口,看nginx服务器能不能给我们传回8080端口的tomcat默认页内容

反向代理

新建一个tomcat容器配置端口8081:8080

在default.conf文件末尾追加一个新的虚拟服务器(需要更改默认服务器的监听端口,不然会冲突)

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name reverse.proxy;

location ~ /edu/ {
proxy_pass http://47.113.225.244:8080;
}

location ~ /bus/ {
proxy_pass http://47.113.225.244:8081;
}
}

两个tomcat服务器分别放入对应端口号的html文件,实验结果如下

image-20210927154055278

image-20210927154110328

location匹配url指令说明

image-20210927154340177

负载均衡

实现效果:输入一个url后代理服务器根据负载情况分发请求到8080或者8081端口

在nginx.conf文件的http块中添加负载均衡服务器配置,名为myserver

1
2
3
4
5
6
upstream myserver {
#ip_hash; 可以开启ip_hash模式
server 47.113.225.244:8080 weight=1;
server 47.113.225.244:8081 weight=1;
#fair; 可以开启fair模式
}

在default.conf文件,将我们的myserver服务器添加到代理配置中

1
2
3
4
5
6
7
8
server {
listen 80;
server_name 47.113.225.244;

location / {
proxy_pass http://myserver; #这里的myserver是之前配置过的自定义服务器
}
}

这时访问一个页面不断刷新浏览器就可以发现端口号在8080和8081之间不断变动,说明配置成功

动静分离

image-20210927161844122

配置静态资源

配置default.conf

这里的/data/是在容器内部单独创建的静态资源目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name 47.113.225.244;

location /www/ {
root /data/; #root表示本地资源路径目录
index index.html index.htm; #index配置了访问目录路径时默认的页面名
}

location /image/ {
root /data/;
autoindex on; #这个配置开启能够让浏览器取得资源路径的目录结构,
}
}

Nginx集群

image-20210927170203166

要点:

  • 需要多台nginx
  • 需要keepalived
  • 需要虚拟ip

待补充