首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
Nginx笔记
时间:
2016-02-21 00:14:49
阅读:
301
评论:
0
收藏:
0
[点我收藏+]
标签:
alias
和
root
区别,
root
指定了根目录,在定位资源的时候,是
root+
匹配部分
+
资源(没有指定使用
index
指令指定);
alias
则是重写
location
请求
uri
,定位资源就是
alias+
资源;注意
alias
一定是要全路径的,之前配置了相对路径导致了无法获得;
Nginx
作为一个代理服务器,有几个点需要配置:
首先,代理的基本设置,服务器组,设定权重,以及在
location
中声明跳转的组;
其次,改写请求信息,包括对
header
,
body
,
location
的改写;其中有一个改写比较特殊,就是跳转机器的改写:
proxy_next_stream
,通过设定这个配置,如果发生了诸如被代理服务器宕机,将自动跳转到下一个服务器上面;
第三,设定
Buffer
,
Buffer
的作用在于积累一定的相应再一次性返给客户端;
第四,设定
Cache
,
Cache
的
Buffer
的区别在于前者数据会被多次使用,后者一次性推送到客户端之后就无法再次使用;
Cache
有一个配置比较有用,就是
store
,不占用内存,没有过期,对于静态数据的获得很有好处;
负载均衡有几种模式:
第一种是一般轮训,大家机会均等;
第二种,加权轮训,通过在
upstream
块中指定
weight
,其实第一种方式只不过使用了
weight=1
的默认权值而已;
第三种,分组均衡,就是定义
n
组
upstream
,在对不同的资源进行请求的时候(通过在
location
中配置),跳转到不同的
upstream
组;
Nginx
的
Server-location
块正常情况下,匹配到了一个
location
之后,就不会再走别的
location
了,但是
rewrite
指令有一个参数,
last
的意思就是里跳出当前
location
(后面的逻辑也不走了),重新匹配
location
;
break
,则是继续走当前的
location
,不过呢,
URI
就是改写之后那个
URI
了;后面的逻辑处理都是基于这个新的
URL
进行的;
Nginx
最根本的职责是定位资源,基于这个职责有几种角色:
第一个就是
Web
服务器,
location
块中定位的资源是本地
html
页面;
第二个是代理服务器,
location
块中定位资源是本机之外的资源;
代理和重写最大的区别在于:代理的浏览器地址是不变的,这意味着代理不会通知浏览器地址的变更,也意味着浏览器将会少跳转一次;我使用
fiddler
进行抓取,对于重写,浏览器其实请求了两次;对于代理,浏览器只是请求了一次;
代理和重写最大的区别在于:代理的浏览器地址是不变的,这意味着代理不会通知浏览器地址的变更,也意味着浏览器将会少跳转一次;我使用
fiddler
进行抓取,对于重写,浏览器其实请求了两次;对于代理,浏览器只是请求了一次;
nginx
测试一个问题就是浏览器的缓存,我一般采用单独让
firefox
用于测试
nginx
,然后设置缓存区大小为
0
;选项
-
高级
-
网络中进行设置;
在指定
rewrite
的时候一定要为目标地址加上协议前缀(
schema
)
http://
;以为
rewrite
解析的是
URI
;
rewrite
指令有两个参数,
regex
和
replacement
,
regex
是一个正则匹配的表达式,最简单的形式就是网站的一部分,
replacement
则是一个
URI
(或者其自己
URL
)形式的一个参数;
URI
的结构形式为:
schema:[//][[
用户名
[
:密码
@]
主机名
[
:端口号
]][/
资源路径
]
,
URL
的结构形式为:
Schema://
主机名
[
:端口号
][/
资源路径
]
(
"[]"
部分为可选);可见,对于
relacement
参数的格式至少要符合
URL
,所以协议前缀是一定要添加的;
$host
只是主机,我曾经以为
$host
是整个请求字符串,尝试
$host ~ 112\.74\.92\.187\/tao
进行匹配但是总是失败(浏览器中输入
112.74.92.187/tao
),后来猛然醒悟到
host
只是介于
schema
和资源定位之间的那部分主机信息;
对于
$request
是一个请求体,包含
Get Http/1.1
之类的内容,
$uri
以及
requet_uri
通过
Server
节点获取都是
/
,不知道原因是什么;
镜像的机制是主网站提供一下到各个镜像的链接,镜像请求集中想一个
nginx
请求,然后又
nginx
根据请求
url
的不同,再跳往各个真实的镜像地址;比如
mirror1.request.com
,
mirro2.request.com
其实都是映射到同一个
IP
(台机器)上面,通过
nginx
将各个镜像进行委派;之所以这样做是因为可以通过配置
nginx
来改变镜像的地址,如果某个镜像出现问题,想要引导到其他
IP
,通过配置
nginx
即可;如果只是该页面呢?很多页面值都是从数据库重定义的,是否还要让数据库管理员来做?如果想要把这部分任务通过运维管理起来,那么放置到
nginx
,如果发生短暂的意外,只需要修改配置文件即可;
rewrite
命令中的
flag
,
last
:使用重写后的
url
重新再
location
块中执行(这个
flag
小心循环执行,如果重写后的地址仍然能够被同一个
location
匹配的话),
break
:使用重写后的
url
继续执行,
redirect
,将重写后的地址返回给客户端,跳转编码设定为
301
(临时跳转),这个
flag
只适用于非
http/https
协议;
permanent
:跳转编码设定为
302
,不在继续执行,直接将重写的地址返回给客户端;
Nginx
是模块化的架构,主要由五部分组成:
Core
(进程管理模型,日志,配置),
Http
(
URI
解析,
gzip
),
Optional-Http
(
https
支持,图片旋转)
, Mail
,
Third-Part
;
Web
请求处理机制:
Apache
是每个请求都创建一个进程,
Nginx
则是创建一个线程;前者模型简单,后者节约资源;
同步
/
异步以及阻塞
/
非阻塞,同步异步是指请求方的请求进程在发送请求后(等待回应)是否挂起,阻塞非阻塞则是指接收方收到请求后,在等待
IO
处理的时候是否挂起;异步非阻塞的处理机制通常是非常高效的;
事件驱动机制,和传统的顺序驱动实现了解耦,通过事件收集器进行解耦;组成部分:事件接收器(队列
+
轮训器),事件发送器(
dispatcher
)以及事件处理器;
Nginx
提供的事件驱动模型:
select
,
poll
,这两者区别在于
select
是维护三个队列,读,写,异常,
poll
只是维护一个队列,不过在事件描述中增加了类型描述;
epoll
这是
poll
的升华,等待着内核通知变更,避免了整个队列轮训(一旦队列数量很大,效率损耗更大了);但是
windows
不支持
poll
以及
epoll
;
对
Nginx
进行系统参数优化,从
IPv4
(系统参数),网络连接(
nginx
),
CPU
(
nginx
)以及事件驱动(
nginx
)四个方面进行优化;
对
Nginx
进行系统参数优化,从
IPv4
(系统参数),网络连接(
nginx
),
CPU
(
nginx
)以及事件驱动(
nginx
)四个方面进行优化;
IIS
,
apache
这些发布工具的用意其实和
Nginx
是一样的:处理
socket
请求;所以你会发现及时没有部署到
IIS/apache
,在浏览器中敲入
localhost:8093
依然可以出发
nginx
的处理,因为
nginx
在监听所有的对于
8093
端口的请求,即使没有发布;同样道理,对于
nginx
的功能监听到了对于某个端口的请求,然后把这个请求进行处理:发送给另外一个具有监听功能的对象,可以是
nginx
,可以使
IIS
,可以是
tomcat
;其实这些和
http
有关系,在浏览器中敲入路径默认就是
http
协议来对请求进行编码处理(可以通过前缀
ftp
等来强制协议,如此,
nginx
也就无法监听到该请求,因为
nginx
的配置是在
http
块中,这意味着只是监听
http
协议);
tomcat
其实还有很大的一块:内置了对于
servlet
集成,所以
JSP
以及
servlet
开发可以在
tomcat
中跑;
nginx.pid
是一个
nginx
启动完毕之后创建的文件;
配置文件需要
nginx -s reload
才能够实现修改配置生效,加载配置文件是
master
进程的事情,首先会
check
文件是否合法,合法了将会通知旧有的
worker
进程消退,创建新的
worker
进程;
nginx -s reopen
则是用来重新打开
nginx
的日志文件,因为
mv
文件之后,因为文件的
inode
信息不变,所以系统的日志仍然输出到旧有的文件中去;所以需要
reopen
来重新定位日志文件
inode
(日志流将根据新的
inode
输出到对应的日志文件的);
nginx -s stop | quit
,前者是快速,后者则是优雅的等待各个进程处理完毕当前任务后,优雅的退出;
stop
意思是停止,立即,
quit
,则是退出,不急不忙之意;
在
server
中配置
location
块,其本质含义是对请求的
uri
进行匹配,进而决定将请求如何进行处理;处理有两种方式,一种是匹配部分是和物理的路径一直,这个时候需要指定
root
来让
root+
匹配路径
+index
一起来定位物理路径下的网页(如果
uri
中未指定请求的具体资源,如果指定了,比如
http://localhost:8093/server1/location1/pptv.htm
,就不需要附加
index
部分);另外一种方式是匹配的路径和物理路径无关,这个时候需要配置
alias
,
alias
是完整的请求路径名称,可能是物理路径,也可能是一个
http
请求路径;
Rewrite
的本质其实是向客户端(浏览器)回应了(
response
)一个重定向指令(附带着重写的地址),客户端接收后,将会设置浏览器的地址栏,然后再次向重写的地址发送请求;
如果想要把外部请求转接为外部资源,需要在
location
中配置
proxy_pass
,这样匹配的请求将会被重定位到
proxy_pass
资源;代理服务器有两种,一种是正向代理,一种是反向代理,正向代理,请求端和代理服务器一般是在同一个局域网,对于请求进行处理转接,可以理解为请求方来自内部,需要代理服务器将请求资源定位到互联网或者内部网络;反向代理则是请求方来自外部,需要代理服务器定位到本地(网络)内资源;
nginx
启动只要在命令行中敲入
nginx
即可;停止,需要使用
kill -9 + processId,
至于
processId
使用
ps -ef | grep nginx
命令;如果是多个
PID
可以在命令输入多次
kill
,之间使用
";"
做分割,即可一次性删掉多个数据;
配置文件(
/etc/nginx/nginx.conf)
的
work_processes
后面要么跟数字,要么跟
auto
;来决定工作进程个数;
Nginx笔记
标签:
原文地址:http://www.cnblogs.com/xiashiwendao/p/5204222.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!