Nginx基础
基本概念
什么是nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强。
正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都由代理服务器代替来请求。正向代理代理的对象是客户端。
反向代理
客户端不需要任何配置就能访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。反向代理隐藏了真实的服务端,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了。反向代理代理的对象是服务端。
负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
我们首先想到的可能是升级服务器的配置,比如提高CPU执行频率,加大内存等提高机器的物理性能来解决此问题,但是如果将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?
上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
系统的扩展可以分为纵向扩展和横向扩展。 纵向扩展是从单机的角度出发,通过增加系统的硬件处理能力来提升服务器的处理能力 横向扩展是通过添加机器来满足大型网站服务的处理能力
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面有不同的服务器来解析,减少服务器压力,加快解析速度。
安装nginx
依赖介绍
gcc
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境
pcre和prce-devel
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。
zlib
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
openssl
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。 nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
安装命令
yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
wget -c https://nginx.org/download/nginx-1.20.1.tar.gz
tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.20.1/
./configure
make && make install
防火墙放行端口
启动nginx后,在浏览器中输入ip:port发现无法访问,这是因为防火墙拦截了,这时我们需要放行相应端口。
命令列表
firewall-cmd --list-all
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
firewall-cmd --query-port=80/tcp
具体操作列表
[root@localhost sbin]
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@localhost sbin]
[root@localhost sbin]
[root@localhost sbin]
success
[root@localhost sbin]
success
[root@localhost sbin]
yes
设置完防火墙后再次访问就可以了。
配置环境变量
vim /etc/profile
export PATH=$PATH:/usr/local/nginx/sbin
source /etc/profile
常用命令
如果不配置环境变量
版本,在/usr/local/nginx/sbin 目录下执行 ./nginx -v
启动,在/usr/local/nginx/sbin 目录下执行 ./nginx
停止,在/usr/local/nginx/sbin 目录下执行 ./nginx -s stop
重启,在/usr/local/nginx/sbin 目录下执行 ./nginx -s reload
配置环境变量后
版本,nginx -v
启动,nginx
停止,nginx -s stop
重启,nginx -s reload
配置文件
nginx的配置文件都在安装目录下的conf中(/usr/local/nginx/conf),而主配置文件 nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改。配置文件中有很多#开头的表示注释内容,去掉所有以 # 开头的段落,精简之后的内容如下
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;
}
}
}
根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分
全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
worker_processes 1; 这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。上述例子就表示每个 work process 支持的最大连接数为 1024。这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
http块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:http 块也可以包括 http 全局块、server 块。
http全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
serve块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。 而每个 server 块也分为全局 server 块,以及多个 location块。
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
2、location 块
一个 server 块可以配置多个 location 块。 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name),对虚拟主机名称 (也可以是 IP 别名)之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
语法:location [ = | ~ | ~* | ^~ |@ ] uri{...}
uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。
server {
listen 80;
server_name 127.0.0.1;
location /abc{
default_type text/plain;
return 200 "access success";
}
}
以下访问都是正确的
http://192.168.200.133/abc
http://192.168.200.133/abc?p1=TOM
http://192.168.200.133/abc/
http://192.168.200.133/abcdef
- = : 用于不包含正则表达式的uri前,必须与指定的模式精确匹配
server {
listen 80;
server_name 127.0.0.1;
location =/abc{
default_type text/plain;
return 200 "access success";
}
}
可以匹配到
http://192.168.200.133/abc
http://192.168.200.133/abc?p1=TOM
匹配不到
http://192.168.200.133/abc/
http://192.168.200.133/abcdef
- ~ : 用于表示当前uri中包含了正则表达式,并且区分大小写
- ~*: 用于表示当前uri中包含了正则表达式,并且不区分大小写
- ^~: 用于不包含正则表达式的uri前,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了。
反向代理实例
实现效果
使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中
nginx 监听端口为 80,
访问 http://ip/one/index.html 直接跳转到 127.0.0.1:8001/one/index.html
访问 http://ip/two/index.html 直接跳转到 127.0.0.1:8002/two/index.html
准备工作
在虚拟机中安装两个tomcat,分别设置端口为8001和8002(其他端口也要不同)。
在8001的tomcat的webapps中创建文件夹one,在其中放置index.html
在8002的tomcat的webapps中创建文件夹two,在其中放置index.html
tomcat访问测试
nginx配置
nginx反向代理测试
负载均衡实例
实现效果
浏览器地址栏输入地址 http://ip/balance/index.html,平均 8080 和 8081 端口中
准备工作
准备两台 tomcat 服务器,一台 8001,一台 8002
在两台 tomcat 里面 webapps 目录中,创建名称是 balance 文件夹,在 ebalance u 文件夹中放置 index.html,用于测试
tomcat访问测试
nginx配置
nginx负载均衡测试
不断刷新页面,发现在8001和8002之间不断切换,说明轮询方式负载均衡配置成功。
nginx 分配服务器策略
-
第一种 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。 -
第二种 加权轮询 weight 代表权重,默认为 1,权重越高被分配的客户端越多,可以理解为比例分发。 upstream myserver {
server 127.0.0.1:8001 weight=1;
server 127.0.0.1:8002 weight=4;
}
weight=1,weight=4 是表示权重的意思,数字越大,权重越高。
在该例中 8002 这个端口权重就是 8001 的两倍,比如五次请求,大概就是一次分发给 8001 四次分发给 8002
-
第三种 ip_hash 对访问用户的IP进行hash后的结果进行分配,这样每一个用户固定请求同一个后端服务器,能够解决session的问题。使用ip_hash指令无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接收的请求少,而且设置后端服务器权重等方法将不起作用。 upstream myserver {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
ip_hash;
}
上面是最基本的三种算法。我们可以通过改变参数来自行配置负载均衡
upstream myserver{
# ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
参数 | 含义 |
---|
down | 表示当前的server暂时不参与负载 | weight | 默认为1,weight越大,负载的权重就越大 | max_fails | 允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误 | fail_timeout | max_fails次失败后,暂停的时间。 | backup | 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。 |
|