开发工具:
文件大小: 1mb
下载次数: 0
上传时间: 2019-04-19
详细说明:该文档是PDF格式,主要内容包括对nginx历史,安装配置,及对相关步骤的详解。非常适用于初学者和自学者。异步模型-epo‖
Epoll
支持一个进程打开大数目的 socket描述符
IO效率不随FD数目增加而线性下降
使用mmap加速内核与用户空间的消息传递
边缘触发和水平触发
Nginx( engine x)是一个高性能的HTP和反向代理服务器,也是一个MAP/POP3/SMTP服务器。Ngnx是由伊戈尔赛索耶夫
为俄罗斯访问量第二的 Rambler:ru站点(俄文:PaM6nep)开发的,第-一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年
6月1日, nginx1.0.4发布。
Nginx是—款轻量级的Web服务器/反向代理服务器及电子邮件( IMAP/POP3)代理服务器,并在一个BSD-ke协议下发
行。其特点是占有内存少,并发能力强,事实上 nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 ngInx网
站用户有:百度、京东、新浪、网易、腾讯、海宝等。
介绍
nginⅸx功能:提供web服务http反向代理,缓存功能,负载均衡配置,支持SSL,nginx动静分离,URL重写,日志分割
一般 ngInx只服务静态页面,nginⅸx基于cg江作的场景并不是特别的多,而且性能伐善可陈,所以通常会把 ngInx与mysq、PHP
结合,配成为LNMP
使用ηginx服务静态页面时有 apache无法比拟的性能优势,如果用不到 apache某些功能的特性的话,并且ηginκ能满足我们当前
的所有需要,建议使用nginκ当做web服务器(web服务器只能服务静态页面)
nginⅸx官方站点 Www.ngiNx. org是有俄罗斯一个程序员编写的程序,是专门用来为公司做内部站点反向代理
https://www.netcraft.com
在国内有很多的门户站点都开始使用 nginX做门户站点的服务器了
ngInx相对于 apache的优点
相比 Apache服务器, Nginx因其采用的异步非阻塞工作模型,使其具备高并发、低資源消耗的特性,髙度模块化设计使
Nginx具备很好的扩展性在处理静态文件、反向代理请求等方面, Nginx表现出很大的优势。
轻量级,同样起Web服务,比 apache占用更少的内存及资源
抗并发, ngInx处理请求是异步非阻塞的,而 apache则是同步阻塞型的,在高并发下 ngInx能保持低资源低消耗高性能
(非堵塞:现在在进行/O操作时,无需等到数据的返回,可以接着往下执行代码命令,cpu得到充分的利用;堵塞:在执行
I/○操作获取数据时,这个o可能会需要一定的时间才能得到数据返回,才能接着执行接下来的命令,而cpu不能得到充分的利
用)
(同步:是指当线程进行IO操作请求操作时,是你主动关心数据的返回;异步:时至线程无需关心数据是否返回,当数据返回
时,会有相关的时间通知你)
髙度模块化的设计,编写模块相对简单,只能在安装的时候进行编译,但是不能在线添加,阿里已经解决这种问题了,开发了
tenginx
apache相对于 ngInx的优点
rewrite(URL重写功能),比 ngInX的 rewrite强大
模块超多,基本想到的都可以找到,能够在线添加模块
少bg, nginx的bug相对较多
为什么 ngInX性能要比 apache高?
这要得益于ngin是使用了最新的epo网络o模型〔烈队处理),而 apache使用的是传统的 select网络]/O模型(轮迿处理)
在高并发的服务器中轮询/O是最耗时的操作之
ngInx中文参考文档:http://www.nginx.cn/doc
nginx软件下载地址:http://nginx.org/en/download.html
Mainline version: Mainline是 Nginx目前主力在做的版本,可以说是开发版
Stable version:最新稳定版,生产环境上建议使用的版本
egacy versions:遗留的老版本的稳定版
开始安装
安装依赖包
yum -y install gcc gcc-C++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel
gd
#创建用户
groupadd nginx
useradd -g nginx -s/sbin/nologin nginx
# ngInx解压安装
#上传ngin源码包
cd / usr/local/src
mkdir -p /usr/local/nginx
#tar -zxvf nginx-1.10.1.tar.gz
tar -zxvf nginx-1.10.3. tar. gz
#cd nginx-1.10.1
cd nginx-1.16.3##排注意版本号
#编译、定义安装模块
./configure
prefix=/usr/local/nginx
lock-path=/usr/local/ nginx/nginx lock
user=ngInx
group=nginx
-with-httpsslmodule--with-httpflvmodule
-with-httpstubstatusmodule--with-httpgzipstaticmodule\
http-client-body-temp-path=/usr/local/nginx/client/\
http-proxy-temp-path=/usr/local/nginx/proxy/\
http-fastcgi-temp-path=/usr/local/nginx/fcgi/
http-uwsgi-temp-path=/usr/local/nginx/uwsgi\
http-scgi-temp-path=/usr/local/nginx/scgi--with-pcre\
with-file-aio--with-httpimagefiltermodule
以下是http功能模块类中常见的模块。
http类模块名
模块功能说明
ngxhttpcoremodule
http核心模块,对应配置文件中的htp段,包含很多指令,如location指令
ngxhttpaccessmodule
访问控制模块,控制网站用户对 nginx的访问,对应于配置文件中的a11w和deny等指令
ngxhttpauthbasicmodule
通过用户名和密码认证的访问控制,如访问站点时需要数据用户名和密码,指令包括 auth basic和 auth basic user fi1le
ngxhttpcharsetmodule
设置网页显示字符集。指令之一为 charset,如 charset utf-8
ngxhttpfastcgimodule
fastcgi模块,和动态应用相关。该模块下有非常多的子模块。
ngxhttpflvmodule
支持f1v视频流的模块,如边下边播
ngxhttpmp4module
同f1v模块
ngxhttpgzipmodul
压缩模块,用来压缩 nginx返回的响应报文。一股只压缩纯文本内容,因为压绵比例非常大,而图片等不会去压缩
ngxhttpimagefiltermodule
和图片裁剪、缩略图相关模块,需要安装gd- devel才能编译该模块
ngxhttpindexmodule
定义将要被作为默认主页的文件,对应指令为 index。" index index,htm1, index. php"
ngxhttpautoindexmodule
当 index指令指定的主页文件不存在时,交给 autoindex指令,将自动列出目录中的文件 autoindex{on/off}
ngxhttplogmodule
和访问日志相关的模块,指令包括1 og format和 access_1og
ngxhttpmemcachedmodule
和 memcached相关的模块,用于从 memcached服务器中获取相应响应数据
ngxhttpproxymodule
和代理相关,允许传送请求到其它服务器
ngxhttprealipmodule
当 nginx在反向代理的后端提供服务时,获取到真正的客户端地址,否则获取的是反向代理的工P地址
ngxhttpreferermodule
实现防盜链功能的模块
ngxhttprewritemodul
和URL地址重写相关的模块,需要安装pcre- devel才能编译安装该模块
ngxhttpscgimodule
simple cgi,是cgi的替代品,和 fastcgi类似,但更简单
ngxhttpsslmodule
提供ss1功能的模块,即实现HTPS
ngxhttpstubstatusmodule
获取 nginx运行状态信息
ngxhttpupstream
和负载均衡相关模块
这些模块共同组成了nginx的http功能
make&&make install
以下是ht功能模块类中常见的模块。
htp类模块名模块功能说明
ngx_http_core_ht心模块,对应配置文件中的ht段,包含很多指
module
令,如 llocation指令
ngx_http_acces访问控制模块,控制网站用户对g的访间,对应于
s module
配置文件中的alow和deny等指令
n∝xat通过用户名和密码认证的访问控制,如访问站点时需要
basic module
数据用户名和密码,指令包括 auth basic和
auth basic user file
ngx_http_chars设置网页显示字符集。指令之一为charset,如charset
et module
ngx_http_fastcfastcgi模块,和动态应用相关。该模块下有非常多的子
gl_module
模块。
ngxhttpflv_m支持视频流的模块,如边下边播
odule
ngx_http_mp4
module
同fⅣ模块
压缩模块,用来压缩ηginx返回的响应报文。一般只压
ngx_http_gzip
module
缩纯文本内容,因为压缩比例非常大,而图片等不会去
压缩
ngx_http_image和图片裁剪、缩略图相关模块,需要安装gd-devel才館
filter module编译该模块
ngx_http_index定义将要被作为默认主页的文件,对应指令为
module
index. index index. html, index. php
ngx_http_autoin当inde指令指定的主页文件不存在时,交给autoindex
dex module
指令,将自动列出目录中的文件 autoindex{on/ofhl
ngx_http_log_m和访问日志相关的模块,指令包括log_formati和
odule
access_log
ngx_http_mem和memcached相关的模块,用于从memcached服务器
cached module中获取相应响应数据
module proxy和代理相关,允许传送请求到其它服务器
ngx_http
ngx_http_realip当ngin在反向代理的后端提供服务时,获取到真正的
module
客户端地址,否则获取的是反向代理的IP地址
ngx_http_refere
r module
实现防盗链功能的模块
ngx_http_rewrit和UR地址重写相关的模块,需要安装Epcre-devel才能
e module
编译安装该模块
ngx_http_scgi
module
simple cgi,是cgj的替代品,和 fastcgi类似,但更简单
ngx_http_ssl_m
odule
提供ss功能的模块,即实现 Https
ngxhttpstub
status module
获取ngnx运行状态信息
ngx_http_upstr
eam
和负载均衡相关模块
这些模块共同组成了 ngInX的htt功能。
nginx的基本操作
验证 Nginx的配置文件是否正确,检测排错用
[root nginx sbin] #/usr/local/nginx/sbin/nginx-t
重加载 Nginx
[root nginx sbin]# /usr/local/nginx/sbin/nginx-s reload
关闭 nginx
[rootnginx sbin]# /usr/local/nginx/sbin/nginx-s stop
启动 Nginx【安装路径】
[rootnginx sbin]#/usr/local/nginx/sbin/nginx
性能测试
开启 nginx监控,需要写入配置文件
location /nginx status t
stub status on
access log off;
#访问IP,a11代表为所有,此处可以定义具体得IP地址或者网段
allow all
#deny all
# active connections-活跃的连接数量
# server accepts handled requests一总共处理了11989个连接,成功创建11989次握手,总共处理了11991个请求
# reading一读取客户端的连接数
# writing一响应数据到客户端的数量
# waiting一开启 keep-alive的情况下这个值等于actⅳe-( reading+ writing),意思就是 Nginx已经处理完正在等候下一次请
求指令的驻留连接.
日志分割
日志格式
log format main ' Sremote addr -Sremote user [ stime local]"srequest
statusbodybytessent"shttpreferer
shttpuseragel
shttpforwardedfo
access log logs/access log main;
这段内容什么意思呢?我们来理解下。
$ remote addr:客户端的i地址(如果中间有代理服务器那么这里显示的jp就为代理服务器的jp地址)
$ remote_user:用于记录远程客户端的用户名称(一般为“-)
time local:用于记录访问时间和时区
$ request:用于记录请求的ur以及请求方法
$ status:响应状态码
$body_ bytes_sent:给客户端发送的文件主体内容大小
Shttp_referer:可以记录用户是从哪个链接访问过来的
Shttpuser_agent:用户所使用的代理(一般为浏览器)
$http_x_forwarded_-for:可以记录客户端IP,通过代理服务器来记录客户端的jp地址
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$ remote_add拿到的IP地址是反向代理服务器的
iP地址。反向代理服务器在转发请求的http头信息中,可以增加xforwardedfor信息,用以记录原有客户端的IP地址和原来客
户端的请求的服务器地址。
Nginx日志按天切割
编写She脚本 splitLog. sh(记住为 splitLog.sh添加可执行权限)
#/bin/bash#日志保存位置
base_path=7 opt/nginx/ logs
#获取当前年信息和月信息
log_path=s(date-d yesterday +" %Y%m")
#获取昨天的日信息
day=$(date-d yesterday +"%d")
#按年月创建文件夹
mkdir-p $base_path/$log_path
#备份昨天的日志到当月的文件夹
mv $base_path/access log $base_path/$log_path/access_$ day. log
#输出备份日志文件名
echo $base_path/Slog_ path/access_ $day. log
#通过 Nginx信号量控制重读日志
kill -USRI cat/opt/nginx/logs/nginx pid
添加Lnux定时任务
crontab -e
#每天0时1分进行日志分割建议在02-04点之间系统负载小)
01 00***/opt/nginx/logs/split Log. sh
重启 Linux定时任务
crond restart
如果提示以下错误
crond: can' t lock/var/run/ crond,pid, otherpid may be4141:资源暂时不可用
删除/ar/run/ crond pid重新执行命令即可
connection- contro- failed- connections- threshold=5#登陆失败次数限制
connection- contro|-min- connection-delay=108000#限制重试时间,此处为毫秒,注意按需求换算
反向代理
反向代理应该是 Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理( Reverse Proxy)方式是
指以代理服务器来接受 internet上的连接请求,然后将请求转发给內部网络上的服务器,并将从服务器上得到的结果返回给
nternet上请求连接的寳户端,此时代理服务器对外就表现为—个反向代理服务器。简单来说就是真实的服务羅丕能直接被外部
网络访问,所以需要一台代理服务器而代理服务器能被外部网络访问的冋时又跟真实服务器在同一个网络环境,当然也可能是
同一台服务器,端口不同而已。
开启日志分隔
log format main
statussbody_bytes_sent"shttp_referer",ocall"srequest
Sremoteaddrshttpxrealip"-sremoteuser[stimelocalsrequest
shttpuseragent"shttpxforwardedfor
server
listen
8
server name localhost
client max body size 1024M;
location /f
proxypasshttp://localhost:8080;
proxy set header Hosthost;
proxy set header X-Real-IP Sremote addr;
proxy set header X-Forwarded-For $proxy add x forwarded for
保存配置文件后启动Ngin,这样当我们访问 localhost的时候,就相当于访问 localhost:8080了
proxy_ set_header参数解释
proxy_set_header Host shost
允许重新定义或添加字传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义 proxy_set_header时
会继承之前定义的值
默认情况下,只有两个字段被重定义
proxy_set_header Host $proxy_host
proxy_set_header Connection close
实例说明
ngInX对于 upstream默认使用的是基于P的转发,如下配置:
[rootlocalhost nginx# cat test. conf
upstream backend i
server127.0..1:8886;
upstream china i
server china. wangshibo com
server t
listen
80;
servernamewwww.waNgshibo.com
proxysetheaderhostshttphost
proxy set header x-forwarded-for sremote addr
proxy buffer size
64k;
proxy buffers
3264k;
charset utf-8
access log logs/ host access log main;
location =/50x. html t
root html
location/t
proxy pass backend j
location =/customer/straightcustomer/download t
proxypasshttp://china
proxy set header Host Proxy host;
当匹配到/ customer/ straightcustomer,/ download时,使用 china处理,到 upstream就匹配到 hina. wangshibo com,这里直
接转换成IP进行转发了
假如 china. wangshibo com是在另一台 ngInx下配置的,jp为10.2210.116,则$ proxy_ho则对应为102210.116。
此时相当于设置了Host为10.22.10.116。如果想让Host是chinawangshibo.com,则进行如下设置
proxy_set_header Host china. wangshibo com
如果不想改变请求头“Host"的值,可以这样来设置
proxy_set_headerHost$http_host;
但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,更好的方式是使用
$host变量——它的值在请求包含“Host"请求头时为“Host”字段的值,在请求未携带“Host"请求头时为虚拟主机的主域
名
proxy_set_header Host shost
此外,服务器名可以和后端服务器的端口一起传送
proxyset_ header Host Shost: Proxy_port
如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:
proxy_set_header Accept-Encoding " i
3)有了下面三行配置,就可以在web的后端节点服务器端获得客户端用户的真实jp
proxy set header X-real-IP Sremote addr
/后端节点机器获取客户端真实i的第—种方案
proxy set header rEmote-HoST Sremote addr
proxy_ set header x- Forwarded-For$ proxy_add_×_ forwarded_for;//后端节点机器获取客户端真实ip的第二中方
案。当然这两种方案也可以一起配置
其中这个Ⅹ real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实i就被放在Ⅹ real-ip这个变量里了,然
后,在web端可以这样获取:
request getAttribute( X-real-ip")
remote addr代表客户端的,但它的值不是由客户端提供的,而是服务器端根据客户端的ip指定的,当你的浏览器访问某个网
站时,假设中间没有任何代理,那么网站的web服务器(比如 nginX)就会把 remote add设置为
你的机器p;如果你使用了代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把
remote addr设为这台代理机器的ip。
x forwarded for正如上面所述,当你使用了代理时,web服务器就不知道你的真实p了。为了避免这个情况,代理服务器通常
会增加一个叫做 forwarded fork的头消息,把连接它的客户端ip(即你的上网机器的jp)
加到这个头消息里,这样就能保证网站的web服务器能获得真实jp。
使用 haproxy做反向代理
通常网站为了支撑更大的访问,会增加很多web服务器,并在这些服务器前面增加一个反向代理(如 haproxy)它可以把负载均
衡的分布到这些服务器上。你的浏览器访问的首先是这台反向代理服务器,它再把
你的请求转发到后面的web服务器上,这就使得web服务器会把 remote_add设为这台反向代理服务器的i,为了能让你的程序
获得真实的客户端i,就需要给 haproxy增加下面的配置
option forwardfor
它的作用就像上面说的,增加一个ⅹ forwarded for的头信息,把你上网机器的p添加进去。
ttt tn
tt nt nm
实际上要获得用户的真实p,不是只有这一个方法,下面我们继续看
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这里有个X- Forwarded-For变量,这是一个 squid开发的,用于识别通过HTP代理或负载平衡器原始IP一个连接到Web服务器的
客户机地址的非rfc标准,如果有做X- Forwarded-For设置的话,
每次经过 proxy转发都会有记录格式就是cent1, proxy1,poxy2以逗号隔开各个地址,由于他是非rf标准,所以默认是没有
的,需要强制添加,在默认情况下经过 proxy转发的请求,
在后端看来远程地址都是 proxy端的j。也就是说在默认情况下我们使用 request· getAttribute("X- Forwarded-For")获取不到用
户的p,如果我们想要通过这个变量获得用户的ip,
这样配置的意思是
增加一个$ proxy_add_x_ forwarded for到 Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的× Forwarded
For值是空的,所以我们总感觉X- Forwarded-For的值就等于$ proxy_ add x forwarded for的值
实际上当你搭建两台 ngInx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过 request getAttribute("X
Forwarded-For")获得的将会是客户端和第一台ηgjnx的i。
那么$ proxy_add_x_forwarded_fo又是什么?
$ proxy_add_x_forwarded_for变量包含客户端请求头中的"X- Forwarded-For",与$ remote add两部分,他们之间用逗号分
开。
举个例子,有一个web应用,在它之前通过了两个ngnx转发,www.linuxidc.com即用户访问该web通过两台ngInx。
在第一台 ngInx中使用
proxy_set_header X-Forwarded-For Proxy_add_x_forwarded_for
现在的 Proxy_add_xforwarded_for变量的"X- Forwarded-For"部分是空的,所以只有$ remote addr,而$ Sremote addi的值
是用户的jp,于是赋值以后,Ⅹ Forwarded-For变量的值就是用户的真实的p地址了。
到了第二台 ngInx,使用
proxy_set_header X-Forwarded-For Proxy_add_x_forwarded_for
ngn的p地址,于是通过这个赋值以后现在的 X-Forwarded-For的值就变成了"用户的真实tead部分的值是上一台
现在的$ proxy_add x_forwarded_for变量, X-Forwarded-For部分包含的是用户的真实ip,$rel
第一台ηginx的j″,这样就清楚了吧。最后我们看到还有一个$http_x_forwarded_for变量,这个变量就是X-Forwarded-For,
由于之前我们说了,默认的这个X- Forwarded-Fo是为空的,
所以当我们直接使用proxy_set_headerX-forwArded-for$http_x_forwarded_for时会发现,web服务器端使用
request. getAttribute("X- Forwarded-For")获得的值是nu!如果想要通过 request. getAttribute("X- Forwarded-For")获得用户
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.