Nginx学习笔记
一、nginx简介
1、nginx概述
Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日,其将源代码以类BSD许可证的形式发布。
Nginx采用C进行编写,是一款轻量级、高性能的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强(有报告表明能支持高达50,000个并发连接数)。
Nginx能够支持CGI协议的动态语言,比如 perl、php等,但是不支持java。Java程序只能通过与tomcat 配合完成。
2、nginx相关的基础概念
(1)正向代理
正向代理(即通常所说的代理),用于代表内部网络用户向Internet上的服务器(或称外部服务器,通常为Web服务器)发出连接请求,并接收响应结果,执行该代理功能的服务器称为代理服务器。使用代理服务器访问外部网络时,客户端必须在局域网设置中指明代理服务器的地址以及要代理的服务的端口号。
正向代理服务器是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。
正向代理中客户端必须要进行一些特别的设置,比如为浏览器配置代理等。
(2)反向代理
反向代理的方向与正向代理相反,指代表外部网络用户向内部服务器发出请求,即接收来自Internet上用户的连接请求,并将这些请求转发给内部网络上的服务器,然后将从内部服务器上得到的响应返回给Internet上请求连接的客户:执行反向代理服务的服务器称为反向代理服务器,反向代理服务器对外部用户表现为一个服务器。
反向代理服务器位于用户与目标服务器之间,通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
反向代理服务器和目标服务器作为一个整体,对外相当于一个服务器,隐藏真实的目标服务器IP地址,仅暴露代理服务器地址。
反向代理的工作原理是,代理服务器来接受客户端的网络访问连接请求,然后代理服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。整个过程中客户端对代理是无感知的,用户不需要知道目标服务器的地址,也无须在用户端作任何设定,对于用户而言,反向代理服务器就相当于目标服务器。
反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。
(3)负载均衡
负载均衡(Load Balance),其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。
负载均衡分类:
1)软/硬件负载均衡:
软件负载均衡解决方案是指在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡,如DNS Load Balance等。硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备通常称之为负载均衡器。
2)本地/全局负载均衡:
负载均衡从其应用的地理结构上分为本地负载均衡(Local Load Balance)和全局负载均衡(Global Load Balance,也叫地域负载均衡),本地负载均衡针对本地范围的服务器群做负载均衡,全局负载均衡针对不同地理位置、不同网络结构的服务器群做负载均衡。
负载均衡有三种部署方式:路由模式、桥接模式、服务直接返回模式。路由模式部署灵活,此模式中服务器的网关必须设置成负载均衡机的LAN口地址,且与WAN口分署不同的逻辑网络,约60%的用户采用这种方式部署;桥接模式不改变现有的网络架构;服务直接返回(DSR)比较适合吞吐量大特别是内容分发的网络应用。约30%的用户采用这种模式。
负载均衡算法:轮询法、随机法、最小连接法。轮询法,就是将用户的请求轮流分配给服务器,就像是挨个数数,轮流分配;随机法,是随机选择一台服务器来分配任务;最小连接法,将任务分配给此时具有最小连接数的节点,因此它是动态负载均衡算法。
(4)动静分离
动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。动静分离通过把动态页面和静态页面由不同的服务器来解析,能够加快网站的解析速度,降低原来单个服务器的压力。
二、nginx安装
1、安装nginx所需的依赖库
安装使用nginx时需要先安装一些依赖库,比如gzip模块需要zlib 库,rewrite模块需要pcre库,ssl功能需要openssl库等。可以通过如下命令进行相应安装:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2、安装nginx
(1)下载nginx的tar安装包
nginx安装包下载地址:http://nginx.org/
(2)使用Unix下常用的 './configure && make && make install' 过程来编译安装。
备注:默认会安装到/usr/local/nginx目录下,若需要指定安装目录,需要在执行./configure 命令时通过--prefix参数指定路径。eg:./configure --prefix=/usr/workdir/nginx
3、防火墙问题
在windows系统中默认是不能访问linux中的nginx的,因为存在防火墙问题。一般有两种解决办法,一种是关闭防火墙;另一种是开放访问的端口号。
防火墙的开启和关闭需要root权限,相关命令示例如下:
(1)查看防火墙服务的状态:systemctl status firewalld
(2)关闭防火墙:systemctl top firewalld
(3)开启防火墙:systemctl start firewalld
防火墙端口开放设置,相关命令示例如下:
(1)查看当前开放的端口:firewall-cmd --list-all
(2)设置要开放的端口号:
firewall-cmd --add-service=http –permanent
firewall-cmd --add-port=80/tcp --permanent
(3)重启防火墙:firewall-cmd –reload
三、nginx的配置文件详解
nginx主配置文件的默认位置:/usr/local/nginx/conf/nginx.conf
nginx的配置文件由三部分组成:全局快、events块、http块。
1、全局块
全局块指的是从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令。包括配置运行Nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
eg:worker_processes 1; 该参数配置中的值越大,可以支持的并发处理量也越多。
2、events块
此模块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。eg:worker_connections 1024; 表示可以支持的最大连接数为1024。
3、http块
此部分是Nginx服务器配置中应用最频繁的,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。http块一般包括http全局块、server块。
(1)http全局块
包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等配置。
(2)server块
server块和虚拟主机有密切关系,每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。而每个server块又可以分为全局server块和locaton块。
1)全局 server 块:
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
2)location块:
一个server块可以配置一个或多个location块。
location块的主要作用是匹配客户端请求,并分配到相应服务器进行处理。可用于实现地址定向、数据缓存、应答控制以及第三方模块的配置等功能。
location块匹配语法可以分为三部分:location关键字+匹配模式修饰符+正则字符串。
匹配模式包括:以正则字符串开头的匹配模式、与正则字符串完全相同的匹配模式、区分大小写的匹配模式、不区分大小写的匹配模式、其他正则匹配模式等。
以正则字符串开头的匹配模式的修饰符:无修饰符和^~
备注:二者的区别在于:^~匹配到客户端请求后,不再尝试匹配其他location块。
与正则字符串完全相同的匹配模式的修饰符:=
区分大小写的匹配模式的修饰符:~
不区分大小写的匹配模式的修饰符:~*
匹配修饰符优先级:当正则字符串在不同的匹配修饰符号的作用下都可以与客户端的请求匹配时,会出现冲突情况,此时便可以根据匹配修饰符优先级别确定匹配哪个。
优先级从高到底依次为:
完全相同的匹配模式修饰符(=)、无匹配修饰符的完全相同匹配模式、以正则字符串开头的匹配模式的修饰符(^~)、不区分大小写的匹配模式的修饰符(~*)和区分大小写的匹配模式的修饰符(~)、以正则字符串开头的匹配模式的无修饰符。
location块的转发语法中常用的配置有:
root和alias:两个配置命令都是用来重新指定文件的路径的。不同的是root为补充式确定文件路径,alias为替换式确定文件路径。
示例:客户端请求http://172.21.4.112/test/homebg.png,进行如下两种配置时:
location /test {
alias /aaa/image; #最终请求到的是 http://10.10.10.11/aaa/image/homebg.png
}
location /test {
root /aaa/image; #最终请求到的是 http://10.10.10.11/aaa/image/test/homebg.png
}
proxy_pass:proxy_pass的功能与root、alias的类似,都是转发到另一个目的地,只不过proxy_pass指向proxy_url。
proxy_url分为两种类型:
一种是只包含IP和端口号的(连端口之后的/也没有),比如proxy_pass http://localhost:8080,这种方式称为不带URI方式;此时nginx将会保留location中路径部分。
另一种是在端口号之后有其他路径的,包括只有单个/的如proxy_pass http://localhost:8080/,以及端口后还有其他路径的,比如proxy_pass http://localhost:8080/aaa。此时nginx将使用诸如alias的替换方式对URL进行替换,并且这种替换只是字面上的替换。
例如:客户端请求http://172.21.4.112/test/login.html。进行如下两种配置:
location /test {
proxy_pass http://127.0.0.1/abc #代理请求为:http://127.0.0.1/abc/test/login.html
}
location /test {
proxy_pass http://127.0.0.1/abc/ #代理请求为:http://127.0.0.1/abc/login.html
}
四、nginx的常用命令
需要进入到其sbin目录:cd /usr/local/nginx/sbin
(1)查看nginx版本号:./nginx -v
(2)启动nginx:./nginx
(3)关闭nginx:./nginx -s stop
(4)重新加载nginx:./nginx -s reload 在进行nginx.conf修改后可以不用重启,直接通过重新加载使之生效。
五、nginx的工作原理
1、Nginx架构及工作机制
Nginx 在是以守护进程的形式在后台运行的,采用 多线程+异步非阻塞IO事件模型 来处理各种请求。多线程模型包括一个master进程,多个worker进程(Worker进程的个数由配置文件中worker_processes参数决定,一般使worker数和服务器的cpu数相等最为适宜)。master进程作为管理员,主要职责是读取并验证配置信息(nginx.conf),创建、绑定、关闭套接字(IP + PORT),启动、终止、维护worker进程的个数等;而多个worker在收到master的通知后,会通过抢占式的方式获取请求连接,并进行处理。如下图:
2、Worker处理请求的流程原理
客户端发送一个请求首先要经过master,master收到请求后会将请求通知给worker,多个 worker以争抢的机制来抢夺任务,得到任务的worker会将请求经由tomcat(nginx本身是不直接支持java的)做请求转发、反向代理、访问数据库等。
备注:Nginx 在内部维护了一个accept_mutex,其实就是锁,确保在某一时刻,一个请求只能被一个worker进程捕获。
3、nginx处理请求的连接数计算
nginx能处理的请求连接数与worker_connections 和 worker_processes参数配置有关。
客户端发送一个请求,会占用2个或4个worker连接(动静分离时请求静态资源是2)。
nginx能支持的最大并发数计算:
(1)作为静态资源服务器时,最大并发数=worker_connections * worker_processes /2
(2)作为HTTP反向代理时,最大并发数量=worker_connections *worker_processes/4
备注:Nginx采用了Linux的epoll模型来实现高并发下的高效处理。epoll模型是基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。
六、nginx的配置实例说明
此模块主要展示各种场景下的nginx配置修改点,其他部分简略,需自行实践。
1、反向代理实例配置
实例一:
(1)实现效果:windows中在浏览器地址栏输入地址 www.123.com,能跳转到liunx系统中安装部署的tomcat 的主页面。
(2)准备工作:
在liunx系统安装tomcat,使用默认端口8080,并启动。
在windows系统中通过浏览器直接访问tomcat服务器,确保正常。http://172.21.4.112:8080/
(3)进行代理配置,实现tomcat服务器ip和端口的隐藏。
1)在windows系统的host文件进行域名和ip对应关系的配置:
找到host文件目录位置:System32/drivers/etc/HOSTS
在host中添加如下配置:172.21.4.112 www.123.com
2)在nginx的配置文件nginx.conf中进行请求转发的代理配置:
server {
listen 80;
server_name 172.21.4.112;
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
实例二:
(1)实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口的服务中。
nginx 监听端口为 9001
访问 http://172.21.4.112:9001/test0/ 直接跳转到 127.0.0.1:8080
访问 http:// 172.21.4.112:9001/test1/ 直接跳转到 127.0.0.1:8081
(2)准备工作:
准备两个tomcat服务器,一个8080端口,一个8081端口
创建文件夹和测试页面,用于测试。
(3)在nginx的配置文件nginx.conf中进行请求转发的代理配置:
在http块下添加一个server块:
server {
listen 9001;
server_name 172.21.4.112;
location /test0/ {
proxy_pass http://127.0.0.1:8080;
}
location /test1/ {
proxy_pass http://127.0.0.1:8081;
}
}
2、负载均衡实例配置
(1)实现效果:在浏览器地址栏输入地址http://172.21.4.112/lbTest/a.html ,多次刷新请求时能实现负载均衡效果,将请求平均分配到8080和8081端口中。
(2)准备工作:
准备两台tomcat服务器,一台8080 ,一台8081
在两台tomcat里面的webapps目录中,创建名称是lbTest的文件夹,在文件夹中创建
页面a.html(两个a.html要有不同,用于测试区分)。
(3)在nginx的配置文件nginx.conf中进行配置修改:
upstream lbTest {
# 此处有四种均衡方式,详见备注部分
server 172.21.4.112:8080;
server 172.21.4.112:8081;
}
server{
listen 80;
server_name 172.21.4.112;
location / {
proxy_pass http://lbTest;
#proxy_set_header Host $host;#将请求头转发给后端服务器
#proxy_set_header X-Forward_For $remote_addr;#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
}
}
备注:nginx负载均衡分配服务器的策略有四种:轮询、weight、ip_hash、fair。
1)轮询(默认):按请求的时间顺序依次逐一分配,如果服务器down掉,能自动剔除。
2)weight:权重,weight和访问比率成正比,用于后端服务器性能不均的情况。weight的默认为 1。示例配置如下:
upstream myserver {
server 172.21.4.112:5000 weight=10;
server 172.21.4.112:8080 weight=5;
}
3)ip_hash:按请求ip的hash值分配,每个访客固定访问一个后端服务器。可用于解决 session 的问题。
示例配置如下:
upstream myserver {
ip_hash;
server 172.21.4.112:5000;
server 172.21.4.112:8080;
}
4)fair:按后端服务器的响应时间来分配,响应时间短的优先分配到请求。
示例配置如下:
upstream myserver {
fair;
server 172.21.4.112:5000;
server 172.21.4.112:8080;
}
3、动静分离实例配置
Nginx动静分离指的是把动态请求和静态请求分开,不能简单的理解成只是单纯的把动态页面和静态页面物理分离。可以理解成使用 Nginx处理静态请求,Tomcat 处理动态请求。
动静分离从目前实现角度来讲大致分为两种,
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。
动静分离效果可以通过修改location和expires等配置实现。
通过location指定不同的后缀名实现不同的请求转发。
通过expires参数给资源设定一个浏览器缓存过期时间,减少与服务器之间的请求和流量消耗。此种方法非常适合不经常变动的资源。
(1)实现效果:当客户端发起请求时,若请求的是html、css、image等静态资源,则由nginx直接处理;若请求需要进行数据库操作等访问动态资源,则转发至tomcat处理。
(2)准备工作:
在liunx系统中准备静态资源,用于进行访问。创建data目录,并在该目录下创建image和www子目录,放置相应资源文件a.jpg和a.html。
(3)在nginx.conf配置文件中进行配置修改:
server {
listen 80;
server_name 172.21.4.112;
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on;
}
}
(4)测试:
浏览器中输入地址http://172.21.4.112/image/a.jpg
浏览器中输入地址http://172.21.4.112/www/a.html
4、高可用主备模式实例配置
(1)实现效果:通过虚拟ip访问nginx的主界面时,在主nginx异常的情况下能成功切换到备nginx,并成功访问nginx主界面。
(2)准备工作:
需要两台linux主机服务器:172.21.4.112,172.21.4.113
在两台主机上分别安装nginx和keepalived(可用于检测nginx状态)
备注:可使用命令:yum install keepalived -y来安装keepalived,安装后默认会在etc目录下生成keepalived目录,该目录下存在keepalived.conf配置文件。
(3)修改/etc/keepalived/keepalived.conf配置文件。示例如下:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 172.21.4.112
smtp_connect_timeout 30
router_id V_IP #虚拟ip名
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 # 检测脚本执行的间隔
weight 2
}
vrrp_instance VI_1 {
state BACKUP #主备状态标识:可配置为MASTER或BACKUP
interface ens33 # 网卡,可通过ifconfig查看
virtual_router_id 51 #主、备机的virtual_router_id必须相同
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass PASS
}
virtual _ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}
(4)编写检测脚本nginx_check.sh,并添加至/usr/local/src/目录,脚本内容示例:
#!/bin/bash
A=`ps - - C nginx – no- - header |wc - - l`
if [ $A - - eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps - - C nginx -- no- - header |wc - - l` - - eq 0 ];then
killall keepalived
fi
fi
(5)将主从服务器都配置完后,启动nginx和keepalived,并在浏览器地址栏中输入http://192.168.17.50 进行测试。
备注:启动keepalived命令:systemctl start keepalived.service