Nginx学习笔记
一、nginx的基本概念
1.什么是nginx
高性能的HTTP和反向代理的web服务器,同时提供IMAP/POP3/SMTP服务。
- 占用内存少,并发能力强。
- nginx专为性能开发,实现上非常注重效率。
nginx作为HTTP服务器,有下面的基本特性:
- 索引静态文件、索引文件以及自动索引;打开文件描述符缓冲。
- 无缓存的反向代理加速,简单的负载均衡和容错。
- 具有模块化的结构。
- 支持SSL和TLSSNI。
nginx可以在服务器不暂停的情况下对功能进行升级。
2.反向代理
正向代理
如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户要访问Internet,则需要通过代理服务器来访问,这种代理服务叫正向代理。
即在浏览器中配置代理服务器(重要的步骤),让代理服务器去访问目标网址。最终把内容返回。
反向代理
客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择获取数据后,再返回给客户端。此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实的IP地址。
3.负载均衡
传统的请求响应模式是,客户端向服务端发送请求,服务端对数据库进行查询等操作之后,向客户端作出数据响应。对于并发量低或者请求数据少的项目来说,这是个不错的方案。一旦并发量高、请求数据量大的时候,就会出现严重的性能问题。因此,提出了负载均衡的概念。
负载均衡
当遇到并发量高、请求数据量大的时候,单个服务器解决不了,我们增加服务器的数量。然后将请求分发到各个服务器上,将原先请求几种到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是所谓的负载均衡。
4.动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
一把情况下,会把静态资源(html、css、js等)和动态资源(jsp、servelet等)都存放在一个tomcat服务器中,客户端每次发送请求,无论是动态请求还是静态请求,反向代理服务器都会去访问这个tomcat,这会给这个服务器带来一定的请求压力。
动静分离实际上是将动态资源和静态资源分开,一般会把静态资源放在一个单独的服务器中。当客户端向服务器请求的时候,反向代理服务器会根据类型去访问相应的服务器。
二、nginx安装、常用命令和配置文件
nginx安装
linux系统默认80端口不开放,可以设置。
查看开放的端口号
firewall-cmd --list-all
设置开放的端口号
firewall-cmd --add-service=http -permanent
sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd -reload
nginx常用的命令
提示:在使用nginx之前,必须进入nginx的目录。
一般目录是:/usr/local/nginx/sbin
查看nginx的版本号
./nginx -v
启动nginx
./nginx
关闭nginx
./nginx -s stop
查看nginx进程
ps -ef | grep nginx
重新加载nginx
./nginx -s reload
nginx的配置文件
位置
/usr/local/nginx/conf/nginx.conf
nginx配置文件组成
第一部分 全局块
从配置文件到events之间的内容,主要设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入。
worker_processes 1;
这是nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
第二部分 events块
主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个work process可以支持的最大连接数目等。
events{
worker_connections 1024;
}
表示work process支持的最大连接数。
这部分配置对nginx的性能影响较大,在实际中应该灵活配置。
第三部分 http块
http块中包含http全局块、server块。
http全局块
http全局块配置的指令包含文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
server块
这块和虚拟主机有密切联系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器的硬件成本。
每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。
而每个server块也可以分为全局server块,以及同事包含多个location块。
全局server块:
最常见的配置是本虚拟主机的监听配置以及本虚拟主机的名称或者IP配置。
listen 80;
server_name localhost;
localtion块:
这块的主要作用是基于nginx服务器接收到的请求字符串(比如server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
location / {
root html;
index index.html index.htm
}
三、nginx配置实例
下面的实例中,192.168.17.129代表服务器地址。
1.反向代理1
实现效果
打开浏览器,在浏览器地址栏输入指定网址(www.123.com),跳转到linux系统tomcat主页面中。
具体实现
(1)在linux系统中安装tomcat,使用默认端口8080。
- 将tomcat安装文件放到linux系统中,解压。
- 进入tomcat的bin目录中, ./startup.sh启动tomcat服务器
如果是在docker,可以使用docke配置启动端口
(2)对外开放访问的端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd -reload
查看已经开放的端口号
firewall-cmd --list-all
(3)访问过程的分析
(4)具体配置
第一步
在windows系统的host文件进行域名和ip对应关系的配置
Windows/System32/drivers/etc/HOSTS 文件
添加内容在HOST文件中:
192.168.17.129 www.123.com
配置到这里之后,在浏览器中输入
www.123.com:8080
可以访问到tomcat对应的页面。
第二步,在nginx进行请求转发的配置(反向代理配置)
上面的配置信息指的是:当访问192.168.17.129的时候,会默认转发到http://127.0.0.1:8080这个地址
2.反向代理2
实现效果
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听端口为9001,比如
访问http://192.168.17.129:9001/edu/ 直接跳转到127.0.0.1:8080(这个地址其实指向目标服务器的地址)
访问http://192.168.17.129:9001/vod/ 直接跳转到127.0.0.1:8081(这个地址其实指向目标服务器的地址)
具体实现
(1)准备两个tomcat服务器。
(2)创建文件夹和测试的页面
(3)具体配置
找到nginx的配置文件,加上以下的配置。
(4)快放对外访问的端口号
location指令说明
location [ = | ~ | ~* | ^~] uri{
}
符号 | 含义 |
---|
= | 用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并且立即处理该请求 | ~ | 用于表示uri包含正则表达式,并且区分大小写。(常用) | ~* | 用于表示uri包含正则表达式,并且不区分大小写。 | ^* | 用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串匹配。 |
如果uri包含正则表达式,就必须要有 ~ 或者 ~* 标识。
2.负载均衡
实现效果
浏览器地址输入地址 http://192.168.17.129/edu/a.html, 负载均衡效果,平均到8080和8081中。
具体实现
(1)准备两台tomcat服务器,一台8080,一台8081.
(2)在两台tomcat里面webapps目录中,创建名称是edu的文件夹,在edu文件夹中创建页面a.html,用于测试。
(3)在nginx配置文件中进行负载均衡的配置。
首先在http块中加入upstream
upstream myserver{
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}
然后在server块中修改配置
server {
listen 80;
server_name 192.168.17.129;
location / {
proxy_pass http://myserver; # 这里是实现负载均衡的重点
root html;
index index.html index.htm;
}
}
nginx分配服务器的策略
轮询(默认)
每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
weight权重
weight代表权重默认为1,权重越高被分配的客户端越多。
upstream myserver{
server 192.168.17.129:8080 weight=5;
server 192.168.17.129:8081 weight=10;
}
ip hash
每个请求按访问的ip的hash结果分配,这样每个访客固定访问一个后端服务器。可以解决session问题。
upstream myserver{
ip_hash;
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}
fair(第三方)
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{
server 192.168.17.129:8080;
server 192.168.17.129:8081;
fair;
}
3.动静分离
nginx静态分离简单来说就是把动态和静态请求分开,不能理解成只是单纯地把动态页面和静态页面的物理分离。严格意义上说应该是动态请求和静态请求分开,可以理解成使用nginx处理静态页面,tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。另外一种方法是动态和静态文件混合在一起发布,通过nginx分开。
(1)在linux系统中准备一些静态资源。用于访问。文件位置放置为:
data/www/a.html与data/image/01.jpg
(2)具体配置。
在nginx配置文件中进行配置。
server {
listen 80;
server_name 192.168.17.129;
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on;
}
}
(3)测试
在网页中输入 http://192.168.17.129/image,可看到:
实际上是autoindex on 的效果。
autoindex 的效果就是自动创建索引,当开启了autoindex,访问文件的时候,会产生一个目录(如上图所示),如果没有开启autoindex,则会报403错误。
4.nginx配置高可用集群
nginx高可用
在实际使用过程中,nginx由于可能会发生宕机的情况,导致所有请求失败,所以应该采用nginx高可用的策略。
nginx高可用实际上是为了防止出现上面的情况而做出的策略。
当主nginx服务器down了之后,会使用备nginx服务器
对nginx服务器是否正常运行进行检测,如果主nginx服务器down掉,就是用副nginx服务器。
这是一个实际上不存在的ip,但客户端会调用这个ip,通过选择nginx服务器来进行请求。
准备工作
(1)需要两台服务器。
192.168.17.129
192.168.17.131
(2)在两台服务器中安装nginx
(3)在两台服务器中安装keepalived
在usr/目录下使用yum命令
yum install keepalived -y
使用命令
rpm -q -a keepalived
检查是否安装完成。
安装的位置在:
etc/keepalived
下面有个文件叫keepalived.conf ,这是keepalivd的配置文件。
完成高可用配置(主从配置)
(1)修改etc/keepalived/keepalived.conf的配置文件。
配置文件中包含全局配置,脚本配置以及虚拟ip配置。
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVELBACK # 访问到主机,后面填写的是服务器的名字
}
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 # 绑定的网卡
virtual_router_id 51 # 主备机的virtual_router_id必须相同
priority 90 # 主备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 每隔1s发送一个心跳,检测这个主机活着服务器是否还活着
authentication {
auth_type PASS # 权限校验的方式为密码校验
auth_pass 1111 # 密码为1111
}
virtual_ipaddress{
192.168.17.50 # 虚拟ip设置
}
}
相关备注:
- router_id可以进入到
etc/hosts 文件中进行查看编辑
ifconfig
可以看到当前的网卡名字。
(2)在usr/local/src 添加检测脚本nginx_check.sh 。
#!/bin/bash
A=`ps -C nginx -no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx # nginx启动进程的位置
sleep 2
if[`ps -C nginx --no-header |wc -l` -eq 0 ];then # 如果nginx挂掉了,就杀掉进程
killall keepalived
fi
fi
(3)把两台服务器的nginx和keepalived启动。
启动keepalived命令:
system start keepalived.service
查看进程是否启动:
ps -ef | grep keepalived
停止keepalived命令:
systemctl stop keepalived.service
5.nginx原理
两个进程:master和worker
master相当于一个管理员,可以将任务分配给手下的worker。一个nginx只能有一个master进程,但可以有多个worker进程。
“争抢"机制
发送请求先到nginx的master中,然后master将请求分发给worker,worker通过争抢的机制得到任务,通过反向代理完成操作。
好处:
- 可以使用
nginx -s reload 进行热部署,利于nginx进行热部署操作。
假如其中有一个worker在进行工作,当使用nginx -s reload 的时候,其他的worker先进行更新,该工作的worker等完成任务之后再进行更新获取最新的配置。
- 对于每个worker来说,都是独立的进程,不需要加锁。当其中一个worker不能正常工作,也不会影响到其他的worker运行。不会造成请求中断的现象。
需要设置多少个worker?
nginx和redis类似,采用IO多路复用机制,每个worker都是一个独立的进程。每个worker的线程可以把一个cpu的性能发挥到极致,所以worker数和服务器的cpu数相等是最为适宜的。
比如8核服务器就用8个worker,4核服务器就用4个worker。
连接数?
2个或者4个。2个是因为不需要连接tomcat,4个是因为连接了tomcat。
- nginx有一个master,有4个worker,每个worker支持的最大连接数据为1024,问这个nginx支持的最大并发数是多少(worker能最大支持多少个请求)?
首先,worker最大支持的连接数: 4*1024。
因此最大的并发数是:4*1024/2或者4*1024/4
普通的静态访问最大并发数是:worker_connections * worker_processes/2, 而如果是HTTP作为反向代理的话,最大的并发数量是worker_connections * worker_process/4
|