Nginx

Nginx

一、简介

前言

img

Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,公开版本1.19.6发布于2020年12月15日。

代理
正向代理和反向代理的区别

区别有:用途不同。安全性不同。目的不同。代理不同。服务对象不同。功能不同。

  • 用途不同。正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。
  • 安全性不同。正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
  • 目的不同。正向代理实际代理的是客户端。反向代理代理的是目标服务器。
  • 代理不同。正向代理是客户端架构,而反向代理是服务器架构。
  • 服务对象不同。正向代理中,服务器不知道真正的用户是谁。反向代理中,用户不知道真正的服务器是谁。
  • 功能不同。正向代理主要用来解决访问问题。反向代理主要用于解决负载均衡、安全防护,但二者都能提高访问速度。

随笔:需要看使用的位置在哪里?如果说是在客户端则说明是在进行正向代理,反之,在服务器中则是说明进行反向代理。

简洁的说法:

  • 正向代理:服务器无法确认客户端。

  • 反向代理:客户端无法确认服务器。

Nginx的优势
1、作为Web服务器有优势

作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高。

2、作为代理服务器有优势

作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度。

3、作为负载均衡服务器有优势

作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡。

4、性能好

Nginx是专门为性能优化而开发的,在实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对50000个并发连接数的响应,而且只占用很低的内存资源。

5、稳定性强

Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持10000个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的。宕机的概率非常小。

6、高可用性

Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7×24小时不间断地运行。

7、高并发连接

跨平台、配置简单、方向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并 发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少。

8、健康检查功能

如果有一个服务器宕机,会做一个健康检查,再发送的请求 就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。

9、节省宽带

支持GZIP压缩,可以添加浏览器本地缓存。

随笔:

Nginx最突出、最重要的功能就是负载均衡。所以我们使用Nginx最大的需求出发点就是负载均衡。
负载均衡的概念:因为单个服务器的负载承受能力有限,所以当请求并发量超过负载能力之后,就需要搭建集群。


二、安装

  1. 安装依赖包
#	一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  1. 下载并解压安装包
#	创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
#	下载tar包
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -xvf nginx-1.13.7.tar.gz
  1. 安装nginx
#	进入nginx目录
cd /usr/local/nginx
#	进入目录
cd nginx-1.13.7
#	执行命令 考虑到后续安装ssl证书 添加两个模块
./configure --with-http_stub_status_module --with-http_ssl_module
#	执行make命令
make
#	执行make install命令
make install
  1. 启动nginx服务
 /usr/local/nginx/sbin/nginx
  1. 配置nginx.conf
# 打开配置文件
vi /usr/local/nginx/conf/nginx.conf

将端口号改成8089(随便挑个端口),因为可能apeache占用80端口,apeache端口尽量不要修改,我们选择修改nginx端口。

image-20230401162152060

  1. 重启nginx
/usr/local/nginx/sbin/nginx -s reload
#	查看nginx进程是否启动:
ps -ef | grep nginx

image-20230401162453163

  1. 打开网站

image-20230401165759656

#	步骤集中:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
cd /usr/local
mkdir nginx
cd nginx
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -xvf nginx-1.13.7.tar.gz
cd /usr/local/nginx/nginx-1.13.7
./configure --with-http_stub_status_module --with-http_ssl_module
make
make install
/usr/local/nginx/sbin/nginx
 
 # 打开配置文件
vi /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -s reload

#	查看nginx进程是否启动:
ps -ef | grep nginx

三、Nginx常用命令

#	启动 Nginx 服务器
/usr/local/nginx/sbin/nginx
#	停止 Nginx 服务器
/usr/local/nginx/sbin/nginx -s stop
#	重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload

四、nginx配置

文件地址:/usr/local/nginx/conf/nginx.conf

nginx是一个功能非常强大的web服务器加反向代理服务器,同时又是邮件服务器等等 在项目使用中,使用最多的三个核心功能是反向代理、负载均衡和静态服务器
这三个不同的功能的使用,都跟nginx的配置密切相关,nginx服务器的配置信息主要集中在nginx.conf这个配置文件中, 并且所有的可配置选项大致分为以下几个部分

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
  ;
}
main                                # 全局配置
events {                            # nginx工作模式配置
}
http {                                # http设置
    ....
    server {                        # 服务器主机配置
        ....
        location {                    # 路由配置
            ....
        }
        location path {
            ....
        }
        location otherpath {
            ....
        }
    }
    server {
        ....
        location {
            ....
        }
    }
    upstream name {                    # 负载均衡配置
        ....
    }
}

如上述配置文件所示,主要由以一下6个部分组成:

  1. main:用于进行nginx全局信息的配置
  2. events:用于nginx工作模式的配置
  3. http:用于进行http协议信息的一些配置
  4. server:用于进行服务器访问信息的配置
  5. location:用于进行访问路由的配置
  6. upstream:用于进行负载均衡的配置

1、全局块

# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;

上述配置都是存放在main全局配置模块中的配置项

  • user用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
  • worker_processes指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
  • error_log定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
  • pid用来指定进程id的存储文件的位置
  • worker_rlimit_nofile用于指定一个进程可以打开最多文件数量的描述

这个部分配置的是影响Nginx整体运行的配置指令。主要包括:

  • 用户组
  • 允许生成的worker process数
  • PID(进程ID)文件存放位置
  • 日志文件存放位置
  • 日志类型
  • 其它配置文件引入

目前看到的worker_processes就是一个关键配置,它直接影响了Nginx服务器的并发能力。worker_processes越大并发能力越强——当然不是无限的,会受到硬件、操作系统的制约。

2、events块

event {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

上述配置是针对nginx服务器的工作模式的一些操作配置

  • worker_connections 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
  • multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
  • use epoll 配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue

events块涉及的指令主要影响Nginx服务器与用户的网络连接。

常用的设置包括是否开启对多worker process下的网络连接进行序列化、是否允许同时接收多个网络连接、选取哪种事件驱动模型来处理连接请求、每个work process可以同时支持的最大连接数等。

目前我们看到的worker_connections就是指定每个work process的最大连接数为1024。

所以这部分配置对Nginx性能也会有较大影响

3、HTTP块

Nginx 服务器配置中最频繁的部分:代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!

4、server模块

srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息

server {
listen 80;
server_name localhost 192.168.1.100;
root /nginx/www;
index index.php index.html index.html;
charset utf-8;
access_log logs/access.log;
error_log logs/error.log;
......

核心配置信息如下:

  • server:一个虚拟主机的配置,一个http中可以配置多个server
  • server_name:用来指定ip地址或者域名,多个配置之间用空格分隔
  • root:表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
  • index:用户访问web网站时的全局首页
  • charset:用于设置www/路径中配置的网页的默认编码格式
  • access_log:用于指定该虚拟主机服务器中的访问记录日志存放路径
  • error_log:用于指定该虚拟主机服务器中访问错误日志的存放路径

5、location模块

location模块是nginx配置中出现最多的一个配置,主要用于配置路由访问信息

在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以location模块也是一个非常重要的配置模块

一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

images

基本配置

location / {
    root    /nginx/www;
    index    index.php index.html index.htm;
}

location /:表示匹配访问根目录

root:用于指定访问根目录时,访问虚拟主机的web目录

index:在不指定访问具体资源时,默认展示的资源文件列表

反向代理配置方式

通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化

location / {
    proxy_pass http://localhost:8888;
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header Host $http_host;
}

uwsgi配置

wsgi模式下的服务器配置访问方式

location / {
    include uwsgi_params;
    uwsgi_pass localhost:8888
}

6、upstream模块

upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器

简单的配置方式如下

upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 max_fails=3;
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;

核心配置信息如下

  • ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
  • server host:port:分发服务器的列表配置
  • -- down:表示该主机暂停服务
  • -- max_fails:表示失败最大次数,超过失败最大次数暂停服务
  • -- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求/li>

7、配置文件语法要求

  • 如果后面不是大括号,那么单行配置必须用分号结尾
  • server块定义的listen和server_name,二者结合起来必须是唯一的

8、小结

配置文件结构:

  • 全局块
  • events 块
  • http 块
    • http 全局块
    • server 块(可以有多个)
      • server 全局块
      • location 块(可以有多个)

五、反向代理

1、目标

通过Nginx访问Tomcat。

2、Tomcat搭建

必须已经有Java环境才能正常运行

下载Tomcat

image-20230401223453522

将该文件使用 XShell和Xftp 传送到我们的Linux系统中

#	解压
tar -zxvf apache-tomcat-9.0.54.tar.gz
#	进入bin目录执行启动
startup.sh

image-20230401224834945

3、配置Nginx

修改配置文件之后,需要让Nginx重新加载配置文件。

在这里,proxy_pass起到了一个“请求转发”的作用。

注意:一下该服务是进行一个新增,直接加到最后面即可

server {
	server_name www.kews1688.com;
	location / {
		proxy_pass http://localhost:8080;
	}
}

4、配置域名

使用SwitchHosts工具添加如下配置:

192.168.239.128 www.kews1688.com

效果如下

image-20230401233331373

六、location匹配规则

1、概述

Nginx在location配置中还提供了更丰富的语义。上面的例子只是一种非常简单的情况。

location的完整语法格式是:

location [=|~|~*|^~] uri {
    
}

其中匹配规则部分的各个符号含义如下:

  • =:用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
  • ~:用于表示 uri 包含正则表达式,并且区分大小写。
  • ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
  • ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

2、案例

1、目标

访问不同请求地址,通过Nginx跳转到不同的Tomcat。

  • 请求地址包含/edu:跳转到端口号8080
  • 请求地址包含/vod:跳转到端口号8081
2、准备Tomcat
1、原Tomcat

在webapps目录下创建目录:edu

在edu目录下创建index.html

<html>
<head>
<title>Hello</title>
</head>
<body>
<p>8080</p>
</body>
</html>
2、新Tomcat

把Tomcat解压目录复制一份,修改端口号:

vim /opt/apache-tomcat-8081/conf/server.xml
 21  -->
 22 <Server port="8006" shutdown="SHUTDOWN">
 23   <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
 ……
 69     <Connector port="8081" protocol="HTTP/1.1"
 70                connectionTimeout="20000"
 71                redirectPort="8443" />

在webapps目录下创建目录:vod

在vod目录下创建index.html

<html>
<head>
<title>Hello</title>
</head>
<body>
<p>8081</p>
</body>
</html>
启动Tomcat:
```bash
/opt/apache-tomcat-8081/bin/startup.sh
3、配置Nginx
server {
   listen     9000;
   server_name www.zhutou366.com;
   location ~ /edu/ {
	   proxy_pass http://localhost:8080;
   }
   location ~ /vod/ {
	   proxy_pass http://localhost:8081;
   }
}
4、配置域名

在SwitchHosts工具中配置:

192.168.200.100 www.zhutou366.com

七、案例

1、目标

访问不同请求地址,通过Nginx跳转到不同的Tomcat。

  • 请求地址包含/edu:跳转到端口号8080
  • 请求地址包含/vod:跳转到端口号8081

2、准备Tomcat

1、原Tomcat

在webapps目录下创建目录:edu

在edu目录下创建index.html

<html>
<head>
<title>Hello</title>
</head>
<body>
<p>8080</p>
</body>
</html>
#	操作
#	进入webapps目录
cd /opt/apache-tomcat-8.5.32/webapps/
#	创建edu文件夹
mkdir edu
#	创建并修改内容
vim edu/index.html
2、新Tomcat

把Tomcat解压目录复制一份,修改端口号:

vim /opt/apache-tomcat-8081/conf/server.xml
 21  -->
 22 <Server port="8006" shutdown="SHUTDOWN">
 23   <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
 ……
 69     <Connector port="8081" protocol="HTTP/1.1"
 70                connectionTimeout="20000"
 71                redirectPort="8443" />

在webapps目录下创建目录:vod

在vod目录下创建index.html

<html>
<head>
<title>Hello</title>
</head>
<body>
<p>8081</p>
</body>
</html>
启动Tomcat:
/opt/apache-tomcat-8081/bin/startup.sh

③配置Nginx

server {
   listen     9000;
   server_name www.kews8888.com;
   location ~ /edu/ {
	   proxy_pass http://localhost:8080;
   }
   location ~ /vod/ {
	   proxy_pass http://localhost:8081;
   }
}

④配置域名

在SwitchHosts工具中配置:

192.168.239.128 www.kews8888.com

八、负载均衡

1、准备Tomcat

启动两个Tomcat,修改首页内容易于识别即可。

2、配置Nginx负载均衡

upstream atguiguBalance{
	server localhost:8080;
	server localhost:8081;
}

server {
   listen    9100;
   server_name www.kews1688.com;
   location / {
	   proxy_pass http://locahost:8080;
   }
}

3、Nginx负载均衡策略

无论哪种访问策略,第一个访问的服务器实例永远是随机的。

1、轮询

轮流访问每一个服务器实例,如果有服务器宕机可以自动剔除。

images

2、权重

权重大的服务器实例被访问到的几率大。

upstream server_pool{   
	server 192.168.239.128 weight=1;    
	server 192.168.239.128 weight=2; 
	server 192.168.239.128 weight=3;   
}

images

3、IP HASH

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream server_pool{   
	ip_hash;    
	server 192.168.239.128:80;   
	server 192.168.239.128:80;  
	server 192.168.239.128:80;  
}

images

4、公平

按后端服务器的响应时间来分配请求,响应时间短的优先分配。需借助第三方插件。

upstream server_pool{   
	server 192.168.239.128:80;   
	server 192.168.239.128:80;  
	server 192.168.239.128:80;
	fair;    
}

九、工作机制

1、master和worker分工

  • master进程负责分配任务(只有一个)
  • worker进程负责处理请求(可以多个)

images

2、master和worker配合

images

3、当前机制的好处

  • 利于执行热部署操作
    • 比如:执行nginx -s reload,工作中的worker继续工作;空闲worker重新加载配置文件;然后工作中的worker完成工作后执行重新加载。如果没有多个worker,一个worker重新加载配置文件时Nginx对外无法提供服务,相当于暂停。但Nginx是整个项目的入口,即使短时间暂停也不能接受。
  • 独立进程,彼此隔离
    • 每个worker是一个独立的进程,任何一个进程抛异常都不会影响其它进程。
    • 每个worker进程内只有一个线程,基于IO多路复用技术效率极高。
    • 每个worker进程内只有一个线程,不需要加锁,不需要线程间切换,非阻塞运行,省去了大量性能开销。

IO多路复用是Linux系统的新技术,Windows系统没有。

所以在Windows系统部署Nginx无法发挥出Nginx最大的性能。

4、Nginx并发能力评估

1、worker数量

由于Nginx基于IO多路复用机制,每个worker进程中都是单线程,能够把CPU的性能发挥到极致。所以设置的建议是:worker数等于CPU数。

  • worker比CPU少会浪费
  • worker比CPU多会争抢
2、连接数

Nginx总连接数=worker进程数量×每个worker可以建立的连接数

一个请求占用worker几个连接:

  • 访问静态资源的请求:请求占用一个、响应占用一个
  • 访问动态资源的请求:一共四个
    • 前端访问Nginx:请求占用一个、响应占用一个
    • Nginx访问Tomcat:请求占用一个、响应占用一个
3、并发数

所谓并发数,也就是同时能处理的请求数:

  • 访问静态资源的请求:worker进程数×worker连接数÷2
  • 访问动态资源的请求:worker进程数×worker连接数÷4

十、Nginx高可用

Nginx作为整个系统的入口,责任重大。

所以通常结合Keepalived,搭建Nginx高可用。

平常Keepalived中维护的VIP(虚拟IP)关联Nginx的主服务器:

images

如果主服务器宕机,则备份服务器关联VIP:

images

将来主服务器恢复运行,则备份服务器把VIP还给主服务器,自己继续作为备份服务器。

由于用户始终都是在访问VIP,所以对后面主备之间的切换无感。

除了“主备”这种模式,还有“主主”:

  • 当前主服务器宕机,另一个顶上。

  • 宕机的服务器恢复后,不会进行切换,恢复的服务器在旁边待命。


总结:

Nginx(反向代理)主要是进行负载均衡,减轻服务器压力,提高效率,是增加安全性


随笔:

灯火星星,置换须臾。


岁月漫长,欢迎来访。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值