首页 > 技术文章 > Nginx 详解

fengting0913 2021-12-23 16:13 原文

Nginx 基本概念

Nginx 是什么?

Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是:占有内存少,并发性能强,能承受高负载的考验,可高达 50000 个并发连接数

Nginx 可以做什么事情?

反向代理

正向代理指的是:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问

反向代理指的是:客户端请求反向代理服务器,由反向代理服务器选择目标服务器获取数据后返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的 IP 地址

负载均衡

客户端发送多个请求到服务器,单个服务器解决不了,我们增加服务器的数量,将请求分发到各个服务器上,将负载分发到不同的服务器上,即负载均衡

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低单个服务器的压力

Nginx 安装、常用命令和配置文件

Linux 安装 Nginx

依赖

#### pcre

#### openssl

#### openssl-devel

#### zlib  

#### zlib-devel

#### gcc-c++

#### libtool



# 查看版本

pcre-config --version


安装 Nginx

usr/local/nginx/sbin 下有启动脚本 

./nginx 启动



防火墙的设置
# 查看开放的端口号:
firewall-cmd --list-all


# 设置开放的端口号
firewall-cmd --add-service=http -permanent

sudo firewall-cmd --add-port=8001/tcp --permanent


# 重启防火墙
firewall-cmd -reload



Nginx 常用命令

进入 Nginx 的目录

/usr/local/nginx/sbin


# 查看 Nginx 版本号

./nginx -v

# 启动 Nginx
./nginx

# 关闭 Nginx
./nginx -s stop

# 重新加载 Nginx (修改配置文件后重新加载——> Nginx 的热部署)
./nginx -s reload


 

Nginx 配置文件

# 路径:
/usr/local/nginx/conf/nginx.conf

# 详细信息

## 第一部分:全局块

### worker_processes 指的是 Nginx 可以处理的并发数,数字越大,可以处理的并发数越高


## 第二部分:events块,主要影响 Nginx 服务器与用户的网络连接
### worker_connections 指的是支持的可连接数,灵活配置


## 第三部分:http 块

### http 全局块
#### 指的是:文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等



### server块
#### 全局 server 块

#### location 块

##### 一个 server 块中可以配置多个 location 块

server {
	listen			80;				# 监听的 80 端口
	server_name		localhost;		# 主机名称

	location {
		
	
	}
}






Nginx 配置实例1:反向代理

# 实现效果:访问 www.123.com,跳转到 tomcat 主页面

# 具体实现:
## linux 安装 tomcat 8080端口

## 启动 Tomcat 进入 tomcat 的 bin 目录,./startup.sh 启动

## 对外开放 8080 端口
firewall-cmd --add-port=8080/tcp ==permanent
firewall-cmd -reload

## 更改 hosts 文件,增加域名跟 IP 的映射
192.168.1.23	www.123.com

## Nginx 配置
server {
	listen		 80;
	server_name	 192.168.1.23;
	
	location / {
		proxy_pass	http://127.0.0.1:8080;
	}
	
}

Nginx 配置实例2:反向代理升级

# 实现效果:根据访问路径跳转到不同端口的服务中
## 访问 http://192.168.1.23:9001/edu/ 直接跳转到 127.0.0.1:8080
## 访问 http://192.168.1.23:9001/vod/ 直接跳转到 127.0.0.1:8081

# 具体实现:
server {
	listen		 9001;
	server_name	 192.168.1.23;
	
	location ~ /edu/ {
		proxy_pass	http://127.0.0.1:8080;
	}
	location ~ /vod/ {
		proxy_pass	http://127.0.0.1:8081;
	}
}

## 对外开放 9001 8080 8081 端口

## 注意: 

### '=' 表示严格匹配;

### '~' 表示包含正则表达式,区分大小写

### '~*' 表示包含正则表达式,不区分大小写

Nginx 配置实例2:负载均衡

# 实现效果:浏览器输入地址:http://192.168.1.23/edu/a.html,负载均衡效果,平均分担到 8080 和 8081 端口中

# 具体实现:

upstream myserver {
	server 192.168.1.23:8080;
	server 192.168.1.23:8081;
}

server {
	listen		 80;
	server_name  192.168.1.23;
	
	location / {
		proxy_pass http://myserver;
	}


# Nginx 提供了几种不同的分配方式:

## 轮询(默认)
### 即平均负载

## weight 加权轮询

upstream myserver {
	server 192.168.1.23:8080 weight=3;
	server 192.168.1.23:8081 weight=1;
}
### 8080 负载三次, 8081 负载一次

## ip_hash
### 每个请求按访问 IP 的 hash 结果分配,这样每个访客会固定访问一个后端服务器,可以解决 session 共享的问题,若是同一个 IP 访问仍会轮训
upstream myserver {
	ip_hash;
	server 192.168.1.23:8080;
	server 192.168.1.23:8081;
}

### 加入 ip_hash 即可自动给每次请求固定访问的服务器


## fair(第三方)
### 按照后端服务器的响应时间来分配请求,响应短的优先分配
upstream myserver {
	server 192.168.1.23:8080;
	server 192.168.1.23:8081;
	fair;
}

Nginx 配置实例3:动静分离

# 指的是:将动态请求跟静态请求分开,可以使用 Nginx 处理静态页面,Tomcat 处理动态页面,目的是为了请求更高效

## 动态请求指的是:比如:需要请求服务端对数据库进行增删改查,直接去 Tomcat 服务端操作

## 静态请求指的是:比如:客户端请求一个 html、css、image,直接访问借助 Nginx 部署的静态资源服务器

## 实现角度分为两种:

### 一是:纯粹把静态文件独立成单独的域名,放在独立的服务器,也是目前主流的方案;

### 二是:将动态跟静态文件混合在一起发布,通过 Nginx 来分开,通过location指定不同的后缀名实现不同的请求转发,通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。

#### 注意:具体的 Expires 指的是:是给一个资源设定一个过期时间,也就是说无须去服务端验证,直接通过浏览器自身确定是否过期即可,鼓不会产生额外的流量,此种方法非常适合不经常变动的资源。(如经常更新的文件,不建议使用 Expires 来缓存)

##### Expires 3d 指的是 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304, 如果修改,则直接从服务器重新下载,返回状态 200
# 具体配置:

server {
	listen		  80;
	server_name	  192.168.1.23;
	
	location /www/ {
		root	  /data/;
	}
	
	location /image/ {
		root	  /data/;
		autoindex on;		# 列出当前文件夹中的内容;
	}
}


# 测试:

## http://192.168.1.23/image/o1.jpg

## http://192.168.1.23/www/a.html

Nginx 配置高可用集群

借助 Nginx 转发请求到服务器集群中,服务器集群中有某个服务器宕机后会有相应的补救措施,但当 Nginx 宕机后,就会导致请求不到相应的资源,此时即要配置高可用

# 两台服务器中都要安装 Nginx 跟 Keepalived 做主备高可用

# 修改 Keepalived 的配置文件:

## /etc/keepalived/keepzlived.conf

## 启动 keepalived

systemctl start keepalived.service

### 主服务器中的 keepalived 配置

#### 全局定义
global_defs {
	...
	...
	smtp_server            192.168.1.23
	
	smtp_connect_timeout   30
	
	router_id 			   LVS_DEVEL						# 可以写 IP (是代表唯一的值)
}

vrrp_script chk_http_port {
	script				  "/usr/local/src/nginx_check.sh"	# 监测 Nginx 服务器是否存活的脚本路径
	
	interval		      2									# 监测脚本的执行间隔
	
	weight				  2
}

#### 虚拟 IP 的相关配置
vrrp_instance VI_1 {
	state  			      MASTERT						    # 主还是备
	
	interface             ens33							    # 网卡
	
	virtual_router_id     913                               # 主备机的 virtual_router_id 须相同
	
	priority              100                               # 主备机设置不同的优先级,主机大
	
	...
	...
	
	virtual_ipaddress     {
		192.168.1.26									    # 虚拟 IP 地址
	}
}



### 备服务器中的 keepalived 配置

#### 全局定义
global_defs {
	...
	...
	smtp_server            192.168.1.24
	
	smtp_connect_timeout   30
	
	router_id 			   LVS_DEVEL(127.0.0.1)			   # 可以写 IP (是代表唯一的值)
}

#### 监测脚本配置
vrrp_script chk_http_port {
	script				  "/usr/local/src/nginx_check.sh"	# 监测 Nginx 服务器是否存活的脚本路径
	
	interval		      2									# 监测脚本的执行间隔 2 秒
	
	weight				  2								    # 权重
}

#### 虚拟 IP 的相关配置
vrrp_instance VI_1 {
	state  			      BACKUP						    # 主还是备
	
	interface             ens33							    # 网卡
	
	virtual_router_id     913                               # 主备机的 virtual_router_id 须相同
	
	priority              90                                # 主备机设置不同的优先级,主机大
	
	advert_int            1                                 # 每隔多长时间发送心跳监测 1 秒
	
	authentication  {
		auth_type	PASS									# 认证方式是:密码
		auth_pass   6666                                    # 密码是:6666
	}
	
	virtual_ipaddress     {
		192.168.1.26									    # 虚拟 IP 地址(可以绑定多个)
	}
}

nginx_check.sh 监测脚本

#!/bin/bash

A=`ps -C nginx -no-header | wc -l`

if [ $A -eq 0 ];then
	/usr/lcoal/nginx/sbin/nginx
	sleep 2
	if [ `ps -C nginx -no-header | wc -l` -eq 0 ];then
		killall keepalived
    fi
fi


推荐阅读