目录
简介
优点
安装
目录结构
nginx.conf配置文件结构
server虚拟主机配置
listen
server_name
location
root
index
try_files
proxy_pass
使用
反向代理
配置语法
常用指令
proxy_pass
proxy_set_header
proxy_redirect
负载均衡
负载均衡策略
轮询(默认策略)
加权轮询
iphash
动静分离
服务器限流
正常限制访问频率
突发限制访问频率
限制并发服务数
缓存集成
proxy_cache_path
proxy_cache
算法
漏桶算法
令牌桶算法
简介
nginx是一个高性能的http和反向代理的web服务器
正向代理
反向代理
优点
速度更快、并发更高:单次请求或者高并发请求的环境下,Nginx都会比其他Web服务器响应的速度更快
配置简单,扩展性强:由很多模块组成,这些模块的使用可以通过配置文件的配置来添加
高可靠:多进程模式运行,其中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去"拉起"新的worker进程提供服务
热部署:可以在Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能
成本低:开源
安装
Nginx的官方网站为: nginx news
nginx有多种安装方式,本文章基于nginx的源码简单安装,其他安装方式不进行介绍。
1.进入官网查找下载版本链接地址
wget http://nginx.org/download/nginx-1.16.1.tar.gz
2.解压缩
tar -xzf nginx-1.16.1.tar.gz
3.进入资源文件中,寻找configure
./configure
4.编译
make
5.安装
make install
6.启停命令
进入nginx的安装目录:
cd /sbin
启动:
./nginx
停止:
./nginx -s stop
7.访问
ip+端口
看到这个画面说明启动正常
目录结构
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp
├── conf # Nginx所有配置文件的目录
│ ├── fastcgi.conf # fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件
│ ├── fastcgi_params # fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf # Nginx主配置文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相关参数文件
│ ├── scgi_params.default #default结尾的都是备份文件
│ ├── uwsgi_params # uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│ └── index.html # 默认的首页文件
├── logs # Nginx日志目录
│ ├── access.log # 访问日志文件
│ ├── error.log # 错误日志文件
│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp # 临时目录
├── sbin # Nginx命令目录
│ └── nginx # 这是'nginx命令的目录'如Nginx的启动命令
├── scgi_temp # 临时目录
└── uwsgi_temp # 临时目录
————————————————
nginx.conf配置文件结构
... #全局块
events { #events块
...
}http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
}
}
1.全局块:从配置文件开始到events块之间的内容,主要会设置一些影响Nginx服务器整体运行的配置指令
2.events块:配置影响nginx服务器或与用户的网络连接
3.http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
4.server块:配置虚拟主机的相关参数,一个http中可以有多个server
5.location块:配置请求的路由,以及各种页面的处理情况
server虚拟主机配置
server {
listen 80;
server_name www.lijie.com;
location / {
root data/www;
index index.html index.htm;
}
}
listen
用于配置网络监听
listen *:80 | *:8080 #监听所有80端口和8080端口
listen IP_address:port #监听指定的地址和端口号
listen IP_address #监听指定ip地址所有端口
listen port #监听该端口的所有IP连接
server_name
用于虚拟主机的配置
1.基于域名的虚拟主机,通过域名来区分虚拟主机
需要建立/data/www目录,对应域名网站目录下新增index.html文件;
#当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/www目录下文件
server {
listen 80;
server_name www.lijie.com;
location / {
root data/www;
index index.html index.htm;
}
}
格式:
server_name name......;
对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开;可以使用通配符“*”
2.基于端口的虚拟主机,通过端口来区分虚拟主机
使用端口来区分,浏览器使用域名或ip地址:端口号 访问
#当客户端访问www.lijie.com,监听端口号为8080,直接跳转到data/www目录下文件
server {
listen 8080;
server_name www.lijie.com;
location / {
root data/www;
index index.html index.htm;
}
}
3.基于 IP 地址的虚拟主机配置
语法结构和基于域名匹配一样,而且不需要考虑通配符和正则表达式的问题。
server_name 192.168.1.1
location
location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作
location [ = | ~ | ~* | ^~] uri {
}
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配
#优先级1,精确匹配,根路径
location =/ {
return 400;
}
#优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
location ^~ /av {
root /data/av/;
}
#优先级3,区分大小写的正则匹配,匹配/media*****路径
location ~ /media {
alias /data/static/;
}
#优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}
#优先7,通用匹配
location / {
return 403;
}
root
文件存放地址
index
该指令用于设置网站的默认首页。
try_files
try_files 会到硬盘里尝试找这个文件。如果存在名为 /$root/example
(其中 $root
是server快定义的)的文件,就直接把这个文件的内容发送给用户
proxy_pass
用于设置被代理服务器的地址
使用
反向代理
客户端发送请求到反向代理服务器,然后反向代理服务器将请求转发到后端的真实服务器上,并将响应返回给客户端。简单理解为用户直接访问反向代理服务器就可以获得目标服务器的资源。这一过程叫反向代理
配置语法
Nginx反向代理模块的指令是由ngx_http_proxy_module
模块进行解析,该模块在安装Nginx的时候已经自己加装到Nginx中
常用指令
proxy_pass
该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式
server {
listen 80;
server_name localhost;
location /server{#proxy_pass http://192.168.200.146;
proxy_pass http://192.168.200.146/;
}
}当客户端访问 http://localhost/server/index.html
第一个proxy_pass就变成了http://localhost/server/index.html
第二个proxy_pass就变成了http://localhost/index.html
proxy_set_header
更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器
server {
listen 8080;
server_name localhost;
location /server {
proxy_pass http://192.168.200.146:8080/;
proxy_set_header username TOM;
}
}
proxy_redirect
用来重置头信息中的"Location"和"Refresh"的值。
server {
listen 8081;
server_name localhost;
location / {
proxy_pass http://192.168.200.146:8081/;
proxy_redirect http://192.168.200.146 http://192.168.200.133;
}
}
负载均衡
将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性
http {
upstream my_upstream {
server server1.example.com;
server server2.example.com;
}server {
listen 80;
location / {
proxy_pass http://my_upstream;
}
}
}
负载均衡策略
轮询(默认策略)
可以理解为各个服务器权重都为1,每个请求会按时间顺序逐个被分配到不同的后端服务器:
upstream backend {
server localhost:9001;
server localhost:9002;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://backend/;
}
}
加权轮询
weight=number:用来设置服务器的权重,默认为1,权重数字越大,被分配到请求的几率越大
upstream backend {
server localhost:9001 weight=10;
server localhost:9002 weight=5;
server localhost:9003 weight=3;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://backend/;
}
}
iphash
当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上:
upstream backend {
ip_hash;
server localhost:9001;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://backend/;
}
}
动静分离
初衷是为了访问速度。像大图片、视频、CSS 这种静态资源,如果都放在同一个服务器,在请求的时候就会造成带宽压力,如果把这些静态资源分散到不同的服务器,配合CDN,就可以减少服务器的压力。
在配置文件里咱们创建三个 location 模块,分别路由图片,html、反响代理后端请求。达到将静态资源(图片和html资源)和动态资源(后端服务的请求)分离的目的:
# ######## 动静分离开始 ########
# 匹配图片
location ~ .*\.(gif|jpg|pdf|jpeg|png)$ {
expires 8h;
root /nginx/data/image;
}
# 匹配html文件
location ~ .*\.(html)$ {
root /nginx/data/html;
}
# 拦截后台请求,正则匹配 api 路径
location ~* ^/(lb) {
# 配置代理地址
proxy_pass http://myserver;
}
# ######## 动静分离结束 ########
服务器限流
nginx限流就是限制用户的请求速度,防止服务器受不了;有三种限流方式:
正常限制访问频率
限制一个用户发送的请求,Nginx多久接收一个请求。
Nginx中使用ngx_http_limit_req_module模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的
#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
#绑定限流维度
server{
location /seckill.html{
limit_req zone=zone;
proxy_pass http://lj_seckill;
}
}
1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。
突发限制访问频率
限制一个用户发送的请求,Nginx多久接收一个;处理活动时候的突发流量时,可以设置能处理的超过设置的请求数外能额外处理的请求数
#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
#绑定限流维度
server{
location/seckill.html{
limit_req zone=zone burst=5 nodelay;
proxy_pass http://lj_seckill;
}
}
增加:burst=5 nodelay,表示Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢回落,没有其他用户的请求就立即处理,有其他的请求的话Nginx就漏掉不接受请求。
限制并发服务数
Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置
http {
limit_conn_zone $binary_remote_addr zone=myip:10m;
limit_conn_zone $server_name zone=myServerName:10m;
}
server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
rewrite / http://www.lijie.net permanent;
}
}
配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。限流一般都是基于漏桶算法和令牌桶算法实现的
缓存集成
proxy_cache_path
缓存就是数据交换的缓冲区,当用户要获取数据的时候,会先从缓存中去查询获取数据,如果缓存中有就会直接返回给用户,如果缓存中没有,则会发请求从服务器重新查询数据,将数据返回给用户的同时将数据放入缓存,下次用户就会直接从缓存中获取数据。
http{
proxy_cache_path /usr/local/proxy_cache keys_zone=itcast:200m levels=1:2:1 inactive=1d max_size=20g;
}
1.path:缓存路径地址:/usr/local/proxy_cache
2.keys_zone:用来为这个缓存区设置名称和指定大小
keys_zone=itcast:200m 缓存区的名称是itcast,大小为200M,1M大概能存储8000个keys
3.levels:指定该缓存空间对应的目录,最多可以设置3层,每层取值为1|2
levels=1:2 缓存空间有两层目录,第一次是1个字母,第二次是2个字母
举例说明:
itheima[key]通过MD5加密以后的值为 43c8233266edce38c2c9af0694e2107d
levels=1:2 最终的存储路径为/usr/local/proxy_cache/d/07
levels=2:1:2 最终的存储路径为/usr/local/proxy_cache/7d/0/21
levels=2:2:2 最终的存储路径为??/usr/local/proxy_cache/7d/10/e2
4.inactive:指定缓存的数据多次时间未被访问就将被删除
inactive=1d 缓存数据在1天内没有被访问就会被删除
5.max_size:设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源
max_size=20g
proxy_cache
该指令用来开启或关闭代理缓存,如果是开启则自定使用哪个缓存区来进行缓存
zone_name:指定使用缓存区的名称
算法
漏桶算法
漏桶算法是网络中流量整形或速率限制时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。漏桶算法提供的机制:突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,则多余的请求会被拒绝。所以漏桶算法能控制数据的传输速率。
令牌桶算法
令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送;令牌桶算法的机制如下:存在一个大小固定的令牌桶,会以恒定的速率源源不断产生令牌。如果令牌消耗速率小于生产令牌的速度,令牌就会一直产生直至装满整个令牌桶