Http
Http协议介绍
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。尽管通常基于 TCP/IP 层,但它可以在任何可靠的传输层上使用,也就是说,该协议不会像 UDP 那样静默的丢失消息。RUDP——作为 UDP 的可靠化升级版本——是一种合适的替代选择。
http版本
http1.0 短链接 链接 请求 响应 断开
http1.1 长链接 连接 请求 响应 请求 响应 请求 响应 断开
http2 流水线 连接 请求 请求 请求 响应 响应 响应 断开
img统一资源定位符 (URL)
方案或协议
imghttp://
告诉浏览器使用何种协议。对于大部分 Web 资源,通常使用 HTTP 协议或其安全版本,HTTPS 协议。另外,浏览器也知道如何处理其他协议。例如, mailto:
协议指示浏览器打开邮件客户端;ftp:
协议指示浏览器处理文件传输。常见的方案有:
主机
imgwww.example.com
既是一个域名,也代表管理该域名的机构。它指示了需要向网络上的哪一台主机发起请求。当然,也可以直接向主机的 IP address 地址发起请求。但直接使用 IP 地址的场景并不常见。
端口
img:80
是端口。它表示用于访问 Web 服务器上资源的技术“门”。如果访问的该 Web 服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。
路径
img/path/to/myfile.html
是 Web 服务器上资源的路径。在 Web 的早期,类似这样的路径表示 Web 服务器上的物理文件位置。现在,它主要是由没有任何物理实体的 Web 服务器抽象处理而成的。
查询
img?key1=value1&key2=value2
是提供给 Web 服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。Web 服务器可以在将资源返回给用户之前使用这些参数来执行额外的操作。每个 Web 服务器都有自己的参数规则,想知道特定 Web 服务器如何处理参数的唯一可靠方法是询问该 Web 服务器所有者。
片段
img#SomewhereInTheDocument
是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。 例如,在HTML文档上,浏览器将滚动到定义锚点的那个点上;在视频或音频文档上,浏览器将转到锚点代表的那个时间。值得注意的是 # 号后面的部分,也称为片段标识符,永远不会与请求一起发送到服务器。
访问网站分析
-
浏览器分析超链接中的URL
-
浏览器向DNS请求解析网址的IP地址
-
DNS将解析出的IP地址返回浏览器
-
浏览器与服务器建立TCP连接(80端口)
-
浏览器请求文档: GET /index.htmI
-
服务器给出响应,将文档index.html发送给浏览器
-
浏览器显示index.html中的内容
-
释放TCP连接
先连接 后请求
Http请求(request)方法
方法(Method)是对所请求对象所进行的操作,也就是一些命令。 请求报文中的操作有:
img消息头
imgcookies
HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的HTTP协议记录稳定的状态信息成为了可能。
Cookie 主要用于以下三个方面:
-
会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
-
个性化设置(如用户自定义设置、主题等)
-
浏览器行为跟踪(如跟踪分析用户行为等)
详见链接
Http响应(response)方法
响应报文中的状态码
状态码(Status-Code)是响应报文状态行中包含的一个3位数字,指明特定的请求是否被满足,如果没有满足,原因是什么。状态码分为以下五类:
img<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="" cid="n69" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">200 # 成功请求
301 # 永久重定向(redirect) 客户端请求的网页已经永久移动到新的位置,当链接发生变化时,返回301代码告诉客户端链接的变化,客户端保存新的链接,并向新的链接发出请求,已返回请求结果
302 # 临时重定向(redirect) http--->https
304 # 浏览器缓存
403 # 请求不到首页或权限被拒绝
404 # 请求的资源不存在
500 # 服务器内部错误,程序代码错误
502 # 找不到后端的资源
503 # 服务器由于临时的服务器过载或者是维护,无法解决当前的请求
504 # 请求超时</pre>
消息头
imgHttp相关术语
PV(Page View)
访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计。
UV(Unique Visitor)
独立访客,统计1天内访问某站点的用户数(以cookie为依据);访问网站的一台电脑客户端为一个访客。
IP(Internet Protocol)
独立IP数,是指1天内多少个独立的IP浏览了页面,即统计不同的IP浏览用户数量。同一IP不管访问了几个页面,独立IP数均为1;不同的IP浏览页面,计数会加1。 IP是基于用户广域网IP地址来区分不同的访问者的,所以,多个用户(多个局域网IP)在同一个路由器(同一个广域网IP)内上网,可能被记录为一个独立IP访问者。如果用户不断更换IP,则有可能被多次统计。
SOA松耦合架构
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
Nginx基础
Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。
开源: 直接获取源代码高性能: 支持海量并发可靠: 服务稳定
Nginx的优势
Nginx非常轻量
功能模块少 (源代码仅保留http与核心模块代码,其余不够核心代码会作为插件来安装)
代码模块化 (易读,便于二次开发,对于开发人员非常友好)
互联网公司都选择Nginx
1.Nginx技术成熟,具备的功能是企业最常使用而且最需要的
2.适合当前主流架构趋势, 微服务、云架构、中间层
3.统一技术栈, 降低维护成本, 降低技术更新成本。
Nginx采用Epool网络模型,Apache采用Select模型
Select: 当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下。
Epool: 当用户发起请求,epool模型会直接进行处理,效率高效,并无连接限制。
应用场景广泛
开源的web服务器
静态资源
nginx` `apache` `IIS` `lighttpd` `tengine` `openresty
动态
Tomcat java` `Jboos
tomcat 处理动态资源强大 静态不行 所以一般和nginx配合使用
Nginx快速安装
Nginx软件安装的方式有很多种
1.源码编译=>Nginx (1.版本随意 2.安装复杂 3.升级繁琐)
2.epel仓库=>Nginx (1.版本较低 2.安装简单 3.配置不易读)
3.官方仓库=>Nginx (1.版本较新 2.安装简单 3.配置易读,推荐)
yum安装
1.安装Nginx软件所需依赖包
[root@web ~]# yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree
2.配置nginx官方 yum源
[root@web ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
3.安装Nginx服务,启动并加入开机自启
[root@web ~]# yum install nginx -y
[root@web ~]# systemctl enable nginx
[root@web ~]# systemctl start nginx
4.检查Nginx软件版本以及编译参数
[root@web ~]# nginx -v
nginx version: nginx/1.14.0
[root@web ~]# nginx -V # 查看nginx的编译参数
编译安装
下载nginx源码包并解压
可在http://nginx.org/en/download.html下载.tar.gz的源码包,如(nginx-1.4.7.tar.gz)
下载后通过tar -xvzf 进行解压,解压后的nginx目录结构如下:
img为nginx设置安装目录和启用的模块
切换到解压后的nginx目录中执行:
./configure --prefix=/opt/demo/nginx --add-module=/home/fastdfs-nginx-module/src --with-http_stub_status_module --with-http_ssl_module
注: 这里可以使用nginx -V
查看别的已经安装的nginx的参数 别的自己需要什么添加什么参数
参数说明:
--prefix 用于指定nginx编译后的安装目录
--add-module 为添加的第三方模块,此次添加了fdfs的nginx模块
--with..._module 表示启用的nginx模块,如此处启用了http_ssl_module模块
可能出现的错误:
出现:./configure: error: the HTTP rewrite module requires the PCRE library.
解决方法:yum -y install pcre-devel
出现:SSL modules require the OpenSSL library
解决方法:yum install openssl-devel
编译
执行make 进行编译,如果编译成功的话会在第一步中objs中出现一个nginx文件
特别注意:
在已安装的nginx上进行添加模块的话执行到这里就行了,把objs中的nginx替换掉之前的安装的nginx/sbin/中的nginx文件,然后重启nginx就行了,如果执行下一步的install,会导致之前安装的nginx被覆盖,比如之前配置好的nginx.conf文件)
安装
执行make install 进行安装,安装后--prefix 中指定的安装目录下回出现如下目录结构
启动nginx
切入到第四步中的sbin目录或是创建一个nginx软链接
ln -s /opt/demo/nginx/sbin/nginx /usr/bin/nginx
完成后执行:
nginx start(如需开机自启,可在/etc/rc.d/rc.local 文件中添此命令)
如出现:nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
则需通过nginx –c ../conf/nginx.conf 命令指定nginx的配置
nginx配置文件
为了让大家更清晰的了解Nginx软件的全貌,可使用rpm -ql nginx
查看整体的目录结构及对应的功能,如下表格整理了Nginx比较重要的配置文件
1.Nginx主配置文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/nginx.conf | 配置文件 | nginx主配置文件 |
/etc/nginx/conf.d/default.conf | 配置文件 | 默认网站配置文件 |
2.Nginx代理相关参数文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/fastcgi_params | 配置文件 | Fastcgi代理配置文件 |
/etc/nginx/scgi_params | 配置文件 | scgi代理配置文件 |
/etc/nginx/uwsgi_params | 配置文件 | uwsgi代理配置文件 |
3.Nginx编码相关配置文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/win-utf | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/koi-utf | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/koi-win | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/mime.types | 配置文件 | Content-Type与扩展名 |
4.Nginx管理相关命令
路径 | 类型 | 作用 |
---|---|---|
/usr/sbin/nginx | 命令 | Nginx命令行管理终端工具 |
/usr/sbin/nginx-debug | 命令 | Nginx命令行与终端调试工具 |
4.Nginx日志相关目录与文件
路径 | 类型 | 作用 |
---|---|---|
/var/log/nginx | 目录 | Nginx默认存放日志目录 |
/etc/logrotate.d/nginx | 配置文件 | Nginx默认的日志切割 |
默认配置
Nginx主配置文件/etc/nginx/nginx.conf
是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}
来表示开始与结束。
Nginx主配置文件整体分为三块进行学习,分别是CoreModule(核心模块),EventModule(事件驱动模块),HttpCoreModule(http内核模块)
CoreModule
核心模块
user www; #Nginx进程所使用的用户
worker_processes 1; #Nginx运行的work进程数量(建议与CPU数量一致或auto)
error_log /log/nginx/error.log #Nginx错误日志存放路径
pid /var/run/nginx.pid #Nginx服务运行后产生的pid进程号
events
事件模块
events {
worker_connections 25535; #每个worker进程支持的最大连接数
use epoll; #事件驱动模型, epoll默认
}
http
内核模块
http { #http层开始
...
#使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
'server' {
listen 80; #监听端口, 默认80
server_name www.baidu.com; #提供的域名
access_log access.log; #该网站的访问日志
#控制网站访问路径
'location' / {
root /usr/share/nginx/html; #存放网站源代码的位置 #这里可以是root也可以是alias 如果是root 那么找的就是
index index.html index.htm; #默认返回网站的文件
}
}
...
#第二个虚拟主机配置
'server' {
...
}
include /etc/nginx/conf.d/*.conf; #包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
} #http层结束
http server location扩展了解项
-
http{}
层下允许有多个Server{}
层,一个Server{}
层下又允许有多个Location
-
http{}
标签主要用来解决用户的请求与响应。 -
server{}
标签主要用来响应具体的某一个网站。 -
location{}
标签主要用于匹配网站具体URL路径。
root与alias的区别
格式
nginx指定文件路径有两种方式root和alias,指令的使用方法和作用域:
[root]
语法:root path
默认值:root html
配置段:http、server、location、if
[alias]
语法:alias path
配置段:location
root与alias主要区别
在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
root的处理结果是:root路径 + location路径
alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无。
例:
# 如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。
location ^~ /t/ {
root /www/root/html/;
}
# 如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。
# 注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
location ^~ /t/ {
alias /www/root/html/new_t/;
}
-
使用alias时,目录名后面一定要加"/"。
-
alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
-
alias只能位于location块中。(root可以不放在location中)
Nginx网站配置
1.新增nginx
配置文件
[root@web01 conf.d]# cat /etc/nginx/conf.d/game.conf
server {
listen 80;
server_name game.baidu.com;
location / {
root /code;
index index.html;
}
}
2.放置源代码文件至nginx配置文件root指定的目录
[root@web01 conf.d]# mkdir /code && cd /code
[root@web01 code]# rz html5.zip
[root@web01 code]# unzip html5.zip
[root@web01 code]# ls
ceshi game html5.zip img index.html readme.txt
3.检查nginx
的语法是否存在错误
[root@web01 code]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
4.重载Nginx [reload|restart]
[root@web01 code]# systemctl reload nginx
reload和restart的区别
reload 平滑重启 等连接断开后重启
restart 强制重启 强制断开连接
Nginx虚拟主机
通常在企业中可能会有很多业务系统,那么多套业务服务如何使用Nginx配置?
如果使用如上方式部署,则需要多台服务器配置Nginx,但如果使用虚拟主机方式,则在同一个Nginx上运行多套单独服务,这些服务是相互独立的。简单来说,看似多套业务系统,实则可以运行在一台Nginx服务上
Nginx配置虚拟主机有如下三种方式:
方式一、基于主机多IP方式
方式二、基于端口的配置方式
方式三、基于多个hosts名称方式(多域名方式)
基于多IP的虚拟主机配置实战
那么基于多IP的方式,有如下两种方式:
1.配置多网卡多IP的方式
server {
...
listen 10.0.0.10:80;
...
}
server {
...
listen 10.0.0.11:80;
...
}
1.配置单网卡多IP的方式
#添加一个IP
[root@web01 ~]# ip addr add 10.0.0.11/24 dev eth0
# 虚拟机配置方案
[root@web01 ~]# cat /etc/nginx/conf.d/addr1.conf
server {
...
listen 10.0.0.10:80;
...
}
[root@web01 ~]# cat /etc/nginx/conf.d/addr2.conf
server {
...
listen 10.0.0.11:80;
...
}
基于端口虚拟主机配置实战
Nginx多端口虚拟主机方式,具体配置如下
#仅修改listen监听端口即可, 但不能和系统端口出现冲突
[root@web01 ~]# cat /etc/nginx/conf.d/port1.conf
server {
...
listen 80;
...
}
[root@web01 ~]# cat /etc/nginx/conf.d/port2.conf
server {
...
listen 81;
...
}
[root@web01 ~]# cat /etc/nginx/conf.d/port3.conf
server {
...
listen 82;
...
}
基于host名称的虚拟主机方式配置实战
1.创建对应的web站点目录以及程序代码
[root@web01 ~]# mkdir /soft/code/{server1,server2}
[root@web01 ~]# echo "server1" > /code/server1/index.html
[root@web01 ~]# echo "server2" > /code/server2/index.html
2.配置不同域名的虚拟主机
[root@web02 ~]# cat /etc/nginx/conf.d/server1.conf
server {
listen 80;
server_name 1.baidu.com;
root /code/server1;
index index.html;
...
}
[root@web01 ~]# cat /etc/nginx/conf.d/server2.conf
server {
...
listen 80;
server_name 2.baidu.com;
root /code/server2;
index index.html;
}
Nginx日志管理
Nginx有非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令定义格式。
1.log_format定义日志格式语法
# 配置语法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http
2.默认Nginx定义语法格式如下
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
3.Nginx
日志格式允许包含的内置变量
$remote_addr # 记录客户端IP地址
$remote_user # 记录客户端用户名
$time_local # 记录通用的本地时间
$time_iso8601 # 记录ISO8601标准格式下的本地时间
$request # 记录请求的方法以及请求的http协议
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec # 日志写入时间。单位为秒,精度是毫秒。
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time # 请求花费的时间,单位为秒,精度毫秒
# 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。
# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
# 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。
4.access_log
日志配置语法
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
5.Nginx Access
日志配置实践
server {
listen 80;
server_name code.baidu.com;
#将当前的server网站的访问日志记录至对应的目录,使用main格式
access_log /var/log/nginx/code.baidu.com.log main;
location / {
root /code;
}
#当有人请求改favicon.ico时,不记录日志
location /favicon.ico {
access_log off;
return 200;
}
}
日志切割logrotate
[root@nginx conf.d]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天切割日志
missingok # 日志丢失忽略
rotate 52 # 日志保留52天
compress # 日志文件压缩
delaycompress # 延迟压缩日志
notifempty # 不切割空文件
create 640 nginx adm # 日志文件权限
sharedscripts
postrotate # 切割日志执行的命令
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
Nginx模块
Nginx目录索引
ngx_http_autoindex_module
ngx_http_autoindex_module
模块处理以斜杠字符('/')结尾的请求,并生成目录列表。
当ngx_http_index_module
模块找不到索引文件时,通常会将请求传递给模块。
1.指令
#启用或禁用目录列表输出,on开启,off关闭。
Syntax: autoindex on | off;
Default: autoindex off;
Context: http, server, location
#指定是否应在目录列表中输出确切的文件大小,on显示字节,off显示大概单位。
Syntax: autoindex_exact_size on | off;
Default: autoindex_exact_size on;
Context: http, server, location
#指定目录列表中的时间是应以本地时区还是UTC输出。on本地时区,off UTC时间。
Syntax: autoindex_localtime on | off;
Default: autoindex_localtime off;
Context: http, server, location
2.示例配置
[root@web ~]# cat /etc/nginx/conf.d/module.conf
server {
listen 80;
server_name module.baidu.com;
charset utf-8,gbk; #设定字符集,防止中文字符乱码显示。
location /download {
root /code/;
autoindex on;
autoindex_exact_size off;
}
}
Nginx状态监控
ngx_http_stub_status_module
ngx_http_stub_status_module
模块提供对基本状态信息的访问。
默认情况下不构建此模块,应使用--with-http_stub_status_module
配置参数启用它 。
1.指令
Syntax: stub_status;
Default: —
Context: server, location
2.示例配置
[root@web ~]# cat /etc/nginx/conf.d/module.conf
server {
listen 80;
server_name module.bgx.com;
access_log off;
location /nginx_status {
stub_status;
}
}
3.此配置创建一个简单的网页,其基本状态数据可能如下所示:
img4.提供以下状态信息
Active connections # 当前活动客户端连接数,包括Waiting等待连接数。
accepts # 已接受总的TCP连接数。
handled # 已处理总的TCP连接数。
requests # 客户端总的http请求数。
Reading # 当前nginx读取请求头的连接数。
Writing # 当前nginx将响应写回客户端的连接数。
Waiting # 当前等待请求的空闲客户端连接数。
# 注意, 一次TCP的连接,可以发起多次http的请求, 如下参数可配置进行验证
keepalive_timeout 0; # 类似于关闭长连接
keepalive_timeout 65; # 65s没有活动则断开连接
Nginx访问控制
ngx_http_access_module
ngx_http_access_module
模块允许限制对某些客户端地址的访问。
1.指令
#允许配置语法
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
#拒绝配置语法
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
2.示例配置,拒绝指定的IP访问该网站的/nginx_status, 其他IP全部允许访问
location /nginx_status {
stub_status;
#deny 192.168.5.4/32; #拒绝某个ip访问其他的都可以访问
#allow all;
allow 127.0.0.1; #监控nginx状态时,仅允许该服务器的回环地址访问
deny all;
}
3.示例配置,只允许指定的来源IP能访问/nginx_status, 其它网段全部拒绝
[root@web ~]# cat /etc/nginx/conf.d/module.conf
server {
listen 80;
server_name module.bgx.com;
location /nginx_status {
stub_status;
allow 127.0.0.1; #监控nginx状态时使用
allow 10.0.0.1/32; #允许地址或地址段
deny all; #拒绝所有人
}
}
注意:deny和allow的顺序是有影响的
-
默认情况下,从第一条规则进行匹配
-
如果匹配成功,则不继续匹配下面的内容。
-
如果匹配不成功,则继续往下寻找能匹配成功的内容。
Nginx资源限制
ngx_http_auth_basic_module
ngx_http_auth_basic_module
模块允许使用HTTP基本身份验证,验证用户名和密码来限制对资源的访问。
1.指令
#使用HTTP基本身份验证协议启用用户名和密码验证。
Syntax: auth_basic string| off;
Default: auth_basic off;
Context: http, server, location, limit_except
#指定保存用户名和密码的文件
Syntax: auth_basic_user_file file;
Default: -
Context: http, server, location, limit_except
2.指定保存用户名和密码的文件,格式如下:
#可以使用htpasswd程序或"openssl passwd"命令生成对应的密码;
name1:passwd1
name2:passwd2
#使用htpaaswd创建新的密码文件, -c创建新文件 -b允许命令行输入密码
[root@xuliangwei ~]# yum install httpd-tools
[root@xuliangwei ~]# htpasswd -b -c /etc/nginx/auth_conf admin 123456 #这里如果不想留下history记录 可以不使用-b
3.在conf中配置
auth_basic "what's your problem ?";
auth_basic_user_file /etc/nginx/auth_conf;
Nginx访问限制
经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,从而影响业务,针对这种情况我们可以考虑对同一个ip的连接数,请求数、进行限制。
ngx_http_limit_conn_module
ngx_http_limit_conn_module
模块用于限制定义key的连接数,特别是来自单个IP地址的连接数。
但并非所有连接都被计算在内,仅当连接已经读取了整个请求头时才计算连接。
1.指令
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
2.设置共享内存区域和给定键值的最大允许连接数。超过此限制时,服务器将返回错误以回复请求
# http标签段定义连接限制
http{
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
}
server {
# 同一时刻只允许一个客户端连接
limit_conn conn_zone 1;
location / {
root /code;
index index.html;
}
3).使用ab
工具进行压力测试
[root@xuliangwei ~]# yum install -y httpd-tools
[root@xuliangwei ~]# ab -n 20 -c 2 http://127.0.0.1/index.html
4).nginx日志结果
2018/10/24 18:04:49 [error] 28656#28656: *1148 limiting connections by zone "conn_zone", client: 123.66.146.123, server: www.xuliangwei.com, request: "GET / HTTP/1.0", host: "www.xuliangwei.com"
2018/10/24 18:04:49 [error] 28656#28656: *1155 limiting connections by zone "conn_zone", client: 123.66.146.123, server: www.xuliangwei.com, request: "GET / HTTP/1.0", host: "www.xuliangwei.com"
ngx_http_limit_req_module
ngx_http_limit_req_module
模块用于限制定义key请求的处理速率,特别单一的IP地址的请求的处理速率。
1.指令
#模块名ngx_http_limit_req_module
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
Syntax: limit_conn zone number [burst=number] [nodelay];
Default: —
Context: http, server, location
2.设置共享内存区域和请求的最大突发大小。过多的请求被延迟,直到它们的数量超过最大的限制,在这种情况下请求以错误终止。
# http标签段定义请求限制, rate限制速率,限制一秒钟最多一个IP请求
http {
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
}
server {
listen 80;
server_name module.bgx.com;
# 1r/s只接收一个请求,其余请求拒绝处理并返回错误码给客户端
#limit_req zone=req_zone;
# 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回503 写nodelay的话延时后面剩下的直接被拒绝
limit_req zone=req_zone burst=3 nodelay;
location / {
root /code;
index index.html;
}
}
3).使用ab
工具进行压力测试
[root@xuliangwei ~]# yum install -y httpd-tools
[root@xuliangwei ~]# ab -n 500 -c 2 http://127.0.0.1/index.html
4).nginx日志结果
2018/10/24 07:38:53 [error] 81020#0: *8 limiting requests, excess: 3.998 by zone "req_zone", client: 10.0.0.10, server: module.bgx.com, request: "GET /index.html HTTP/1.0", host: "10.0.0.10"
2018/10/24 07:38:53 [error] 81020#0: *9 limiting requests, excess: 3.998 by zone "req_zone", client: 10.0.0.10, server: module.bgx.com, request: "GET /index.html HTTP/1.0", host: "10.0.0.10"
Nginx连接限制没有请求限制有效?
我们先来回顾一下http协议的连接与请求,首先HTTP是建立在TCP基础之上, 在完成HTTP请求需要先建立TCP三次握手(称为TCP连接),在连接的基础上在完成HTTP的请求。
所以多个HTTP请求可以建立在一次TCP连接之上, 那么我们对请求的精度限制,当然比对一个连接的限制会更加的有效,因为同一时刻只允许一个TCP连接进入, 但是同一时刻多个HTTP请求可以通过一个TCP连接进入。所以针对HTTP的请求限制才是比较优的解决方案。
Nginx Location
使用Nginx Location可以控制访问网站的路径, 但一个server允许出现多个location配置, 那多个location出现冲突谁的优先级会更高呢
1.Location
语法示例
location [=|^~|~|~*|!~|!~*|/] /uri/ { ...
}
2.Location
语法优先级排列
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配 | 1 |
^~ | 以某个字符串开头 | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
!~ | 区分大小写不匹配的正则 | 5 |
!~* | 不区分大小写不匹配的正则 | 6 |
/ | 通用匹配,任何请求都会匹配到 | 7 |
3.配置网站验证Location
优先级
[root@Nginx conf.d]# cat testserver.conf
server {
listen 80;
server_name module.baidu.com;
location / {
default_type text/html;
return 200 "location /";
}
location =/ {
default_type text/html;
return 200 "location =/";
}
location ~ / {
default_type text/html;
return 200 "location ~/";
}
# location ^~ / {
# default_type text/html;
# return 200 "location ^~";
# }
}
4.测试Location优先级
# 优先级最高符号=
[root@Nginx conf.d]# curl module.baidu.com
location =/
# 注释掉精确匹配=, 重启Nginx
[root@Nginx ~]# curl module.baidu.com
location ~/
# 注释掉~, 重启Nginx
[root@Nginx ~]# curl module.baidu.com
location /
5.Locaiton规则配置应用场景
# 通用匹配,任何请求都会匹配到
location / {
...
}
# 严格区分大小写,匹配以.php结尾的都走这个location
location ~ \.php$ {
...
}
# 严格区分大小写,匹配以.jsp结尾的都走这个location
location ~ \.jsp$ {
...
}
# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
location ~* .*\.(jpg|gif|png|js|css)$ {
...
}
# 不区分大小写匹配
location ~* "\.(sql|bak|tgz|tar.gz|.git)$" {
...
}
网友评论