基本篇
1、环境
服务器版本:CentOS 7.2
为了保准学习周期不遇到奇怪的事情,请保准以下四点(大神选取性无视)
确认系统网络
确认yum可用
确认关闭iptables
确认停用selinux #查看iptables状态systemctl
status firewalld.service #关闭防火墙(临时关闭)
systemctl stop firewalld.service #查看SELinux状态
getenforce #临时关闭SELinuxsetenforce 0
安装有些系统基本工具,正常状况系统都会自带(无在装哦) yum -y install
gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install
wget httpd-tools vim
2、Nginx是什么?
Nginx是一个开源且高性能、靠谱的HTTP中间件、代理服务 其他的HTTP服务:
HTTPD-Apache基金会
IIS-微软
GWS-Google(不对外开放)
近几年,Nginx的市场占有率越来越高,一度飙升,为何呢?接下来咱们就晓得了!
3、咱们为何选取Nginx?
1. IO多路复用epoll(IO复用)
怎样理解呢?举个例子吧!
有A、B、C三个老师,她们都遇到一个困难,要帮忙一个班级的学生处理课堂作业。
老师A采用从第1排起始一个学生一个学生轮流解答的方式去回答问题,老师A浪费了非常多时间,并且有的学生作业还无完成呢,老师就来了,反反复复效率极慢。
老师B是一个忍者,他发掘老师A的办法行不通,于是他运用了影分身术,分身出好几个自己同一时间去帮好几个朋友回答问题,最后还没回答完,老师B消耗光了能量累倒了。
老师C比较精明,他告诉学生,谁完成为了作业举手,有举手的朋友他才去指点问题,他让学生主动发声,掰开了“并发”。 这个老师C便是Nginx。
2. 轻量级
功能模块少 - Nginx仅保存了HTTP需要的模块,其他都用插件的方式,后天添加
代码模块化 - 更适合二次研发,如阿里巴巴Tengine
3. CPU亲和
把CPU核心和Nginx工作进程绑定,把每一个worker进程固定在一个CPU上执行,减少切换CPU的cache miss,从而加强性能。
3、安装与目录
自己运用了鸟哥的lnmp集成包 https://lnmp.org,简单方便-举荐! #执行这句语句,按照指引,将安装 nginx php mysql 可进入lnmp官网查看更仔细的过程#默认安装目录/usr/localwget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz && tar zxf lnmp1.4.tar.gz &&cd
lnmp1.4 && ./install.sh lnmp #默认安装目录/usr/local
4、基本配置#打开主配置文件,若你是用lnmp环境安装vim
/usr/local/nginx/conf/nginx.conf
---------------------------------------- user #设置nginx服务的系统运用用户worker_processes #工作进程数 通常状况与CPU核数保持一致error_log #nginx的错误日志pid #nginx起步时的pid
events { worker_connections #每一个进程准许最大连接数 use #nginx运用的内核模型
}
咱们运用 nginx 的 http 服务,在配置文件 nginx.conf 中的 http 区域内,配置无数个 server ,每一个 server 对应这一个虚拟主机或域名
http { ... ... #后面再仔细介绍 http 配置项目
server { listen 80 #监听端口; server_name localhost #位置 location / { #拜访首页路径 root /xxx/xxx/index.html #默认目录index index.html index.htm#默认文件
} error_page 500 504 /50x.html #当显现以上状态码时从新定义到50x.html location = /50x.html { #当拜访50x.html时 root /xxx/xxx/html #50x.html 页面所在位置
}
}
server { ... ...
}
}
一个 server 能够显现多个 location ,咱们对区别的拜访路径进行区别状况的配置 咱们再来瞧瞧 http 的配置详情
http
{ sendfile on #有效传输文件的模式 必定要开启 keepalive_timeout 65 #客户端服务端请求超时时间log_format main XXX#定义日志格式 代号为main access_log /usr/local/access.log main #日志保留位置 格式代码 main
}
5、模块
查看 nginx 已开启和编联进去的模块,模块太多了,就不在这长篇大论,有需要自动百度吧~ #大写V查看所有模块,小写v查看版本
nginx -V # 查看此配置文件 是不是存在语法错误nginx -tc /usr/local/nginx/conf/nginx.conf场景实现篇
1、静态资源WEB服务
1.静态资源类型
非服务器动态运行生成的文件,换句话说,便是能够直接在服务器上找到对应文件的请求
浏览器端渲染:HTML,CSS,JS
照片:JPEG,GIF,PNG
视频:FLV,MPEG
文件:TXT,任意下载文件
2.静态资源服务场景-CDN
什么是CDN?例如一个北京用户要请求一个文件,而文件放在的新疆的资源存储中心,倘若直接请求新疆距离太远,延迟久。运用nginx静态资源回源,分发给北京的资源存储中心,让用户请求的动态定位到北京的资源存储中心请求,实现传输延迟的最小化
2.nginx静态资源配置
配置域:http、server、location #文件高速读取
http { sendfile on
;
} #在 sendfile 开启的状况下,开启 tcp_nopush 加强网络包传输效率#tcp_nopush 将文件一次性一块传输给客户端,就好似你有十个包裹,快递员一次送一个,来回十趟,开启后,快递员讲等待你十个包裹都派件,一趟一块送给你
http { sendfile on
; tcp_nopush on
;
} #tcp_nodelay 开启实时传输,传输方式与 tcp_nopush 相反,追求实时性,然则它仅有在长连接下才生效
http { sendfile on
; tcp_nopushon
; tcp_nodelay on
;
} #将拜访的文件压缩传输 (减少文件资源体积,加强传输速度)#当拜访内容以gif或jpg结尾的资源时
location ~ .*\.(gif|jpg)$ { gzip on; #开启 gzip_http_version 1.1; #服务器传输版本gzip_comp_level2; #压缩比,越高压缩越多,压缩越高可能会消耗服务器性能gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss image/jpeg image/gif image/png;#压缩文件类型 root /opt/app/code; #对应目录(去该目录下寻找对应文件)
} #直接拜访已压缩文件#当拜访路径以download开头时,如www.baidu.com/download/test.img#去/opt/app/code目录下寻找test.img.gz文件,返回到前端时已经是能够浏览的img文件
location ~ load^/download { gzip_static on #开启; tcp_nopush on
;
root /opt/app/code;
}
2、浏览器缓存
HTTP协议定义的缓存机制(如:Expires; Cache-control等 ) 减少服务端的消耗,降低延迟
1.浏览器无缓存
浏览器请求 -> 无缓存 -> 请求WEB服务器 -> 请求相应 -> 呈现
在呈现周期会按照缓存的设置在浏览器中生成缓存
2.浏览器有缓存
浏览器请求 -> 有缓存 -> 校验本地缓存时间是不是过期 -> 无过期 -> 呈现
若过期从新请求WEB服务器
3.语法配置 location ~ .*\.(html|htm)$
{ expires 12h; #缓存12小时
}
服务器响应静态文件时,请求头信息会带上 etag 和 last_modified_since 2个标签值,浏览器下次去请求时,头信息发送这两个标签,服务器检测文件有无出现变化,如无,直接头信息返 etag 和last_modified_since,状态码为304 ,浏览器晓得内容无改变,于是直接调用本地缓存,这个过程亦请求了服务,然则传着的内容极少
3、跨站拜访
研发nginx跨站拜访设置 location ~ .*\.(html|htm)$
{ add_header
Access-Control-Allow-Origin *; add_header
Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; #Access-Control-Allow-Credentials true #准许cookie跨域
}
在响应中指定 Access-Control-Allow-Credentials 为 true 时,Access-Control-Allow-Origin 不可指定为 *,需要指定到详细域名
关联跨域内容可参考 Laravel 跨域功能中间件 运用代码实现跨域,原理与nginx跨域配置相同
4、防盗链
防止服务器内的静态资源被其他网站所套用 此处介绍的 nginx 防盗链为基本方式,其它更加深入的方式将在之后的文案介绍
首要,需要理解一个nginx变量 $http_referer #暗示当前请求上一次页面拜访的位置,换句话说,拜访 www.baidu.com 主页,这是第1次拜访,因此 $http_referer 为空,然则 拜访此页面的时候还需要获取一张首页照片,再请求这张照片的时候 $http_referer 就为 www.baidu.com
而后配置 location ~ .*\.(jpg|gif)$
{ #valid_referers 暗示咱们准许那些 $http_referer 来拜访 #none 暗示无带 $http_referer,如第1次拜访时 $http_referer 为空 #blocked 暗示 $http_referer 不是标准的位置,非正常域名等 #只准许此ip valid_referers none blocked 127
.xxx.xxx.xx if ($invalid_referer) { #不满足状况下变量值为1 return 403
;
}
}
5、HTTP代理服务
Nginx能够实现多种代理方式
HTTP
ICMPPOPIMAP
HTTPS
RTMP
1. 代理区别
区别在于代理的对象不同样
正向代理代理的对象是客户端 反向代理代理的对象是服务端
2. 反向代理
语法:proxy_pass URL
默认:——
位置:loaction #代理端口#场景:服务器80端口开放,8080端口对外关闭,客户端需要拜访到8080#在nginx中配置proxy_pass代理转发时,倘若在proxy_pass后面的url加/,暗示绝对根路径;倘若无/,暗示相对路径,把匹配的路径部分亦给代理走
server { listen 80
;
location / { proxy_pass http://127.0.0.1:8080/; proxy_redirect default
;
proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; #获取客户端真实IP proxy_connect_timeout 30; #超时时间 proxy_send_timeout 60
; proxy_read_timeout 60
; proxy_buffer_size 32
k; proxy_buffering on; #开启缓冲区,减少磁盘io proxy_buffers 4 128
k; proxy_busy_buffers_size256
k; proxy_max_temp_file_size 256k; #当超过内存准许储蓄体积,存到文件
} }负载平衡和缓存服务
1、负载平衡
负载平衡的实现办法便是咱们上章介绍的反向代理 。将客户的请求经过 nginx 分发(反向代理)到一组多台区别的服务器上
这一组服务器咱们叫作为服务池(upstream server),池内的每一个服务器叫作为一个 单元,服务池内将对每一个单元进行请求轮训,实现负载平衡 #配置语法:upstream name ...
默认:——
位置:http upstream #自定义组名 { server x1.baidu.com; #能够是域名
server x2.baidu.com; #server x3.baidu.com #down 不参与负载平衡 #weight=5; 权重,越高分配越多 #backup; 预留的备份服务器 #max_fails 准许失败的次数 #fail_timeout 超过失败次数后,服务暂停时间 #max_coons 限制最大的接受的连接数 #按照服务器性能区别,配置适合的参数 #server 106.xx.xx.xxx; 能够是ip #server 106.xx.xx.xxx:8080; 能够带端口号 #server unix:/tmp/xxx; 支出socket方式
}
假设咱们有三台服务器,并且假设它们的IP位置,前端负载平衡服务器A(127.0.0.1),后台服务器B(127.0.0.2),后台服务器C(127.0.0.3)
新建文件 proxy.conf,内容如下,上一章介绍的反向代理配置 proxy_redirect default
;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 30
; proxy_send_timeout 60
; proxy_read_timeout 60
; proxy_buffer_size 32
k;
proxy_buffering on; proxy_buffers 4 128
k; proxy_busy_buffers_size 256
k; proxy_max_temp_file_size 256
k; #服务器A的配置
http {
...
upstream xxx { server 127.0.0.2
; server 127.0.0.3
;
}
server { liseten 80
;
server_name localhost;
location / { proxy_pass http://xxx #upstream 对应自定义名叫作 include
proxy.conf;
}
}
} #服务器B、服务器C的配置
server { liseten 80
;
server_name localhost;
location / {
index index.html
}
}
调度算法
轮训:按时间次序逐一分配到区别的后端服务器
加权轮训:weight值越大,分配到的几率越高
ip_hash:每一个请求按拜访IP的hash结果分配,这般来自同一个IP固定拜访一个后端服务器
least_conn:最少链接数,哪个设备连接数少就分发给谁
url_hash:根据拜访的URL的hash结果来分配请求,每一个URL定向到同一个后端服务器
hash关键数值:hash自定义key
ip_hash 配置
upstream xxx {
ip_hash; server 127.0.0.2
; server 127.0.0.3
;
}
ip_hash存在缺陷,当前端服务器再多一层时,将获取不到用户的正确IP,获取的将是前一个前端服务器的IP,因此呢 nginx1.7.2版本推出了 url_hash
url_hash 配置 upstream
xxx { hash $request_uri
; server 127.0.0.2
; server 127.0.0.3
;
}
2、缓存服务
1. 缓存类型
服务端缓存:缓存存储在后端服务器,如redis,memcache
代理缓存:缓存存储在代理服务器或中间件上,它的内容是从后端服务器获取的,然则保留在自己本地
客户端缓存:缓存在浏览器内的
2. nginx 代理缓存客户端请求nginx,nginx查看本地是不是有缓存数据,若有直接返回给客户端,若无再去后端服务器请求
http { proxy_cache_path /var/www/cache #缓存位置 levels=1:2 #目录分级 keys_zone=test_cache:10m #开启的keys空间名字:空间体积(1m能够存放8000个key) max_size=10g #目录最大体积(超过时,不常用的将被删除) inactive=60m #60分钟内无被拜访的缓存将清理 use_temp_path=pff; #是不是开启存放临时文件目录,关闭默认存储在缓存位置
server {
...
location / { proxy_cache test_cache;#开启缓存对应的名叫作,在keys_zone命名好 proxy_cache_valid 200 304 12h; #状态码为200 304的缓存12小时 proxy_cache_valid any 10m; #其他状态缓存10小时 proxy_cache_key $host$uri$is_args$args; #设置key值 add_header Nginx-Cache "$upstream_cache_status"
;
}
}
}
当有个特定请求咱们不需要缓存的时候,在上面配置的内容中加入以下配置
server {
... if ($request_uri ~ ^/(login|register) ) { #当请求位置有login或register时 set $nocache = 1; #设置一个自定义变量为true
}
location / { proxy_no_cache $nocache $arg_nocache $arg_comment
; proxy_no_cache $http_pragma $http_authoriztion
;
}
}
3. 分片请求
初期版本 nginx 对大文件的分片请求不支持缓存,1.9版本后slice模块实现了这个功能 前端发起请求,nginx去获取这个请求文件的体积,若超过咱们的定义slice的体积,会进行切片,分割成多个小的请求去请求后端,到前端就作为一个一个独立的缓存文件
优良:每一个子请求收到的数据都会形成独立文件,一个请求中断了,其他请求不受影响,本来状况请求中断,再次请求文件将从头起始,而开启分片请求,就接下去获取未请求的小文件
劣势:当文件很大或slice很小时,可能会引起文件描述符耗尽等状况 语法: slice size; #当大文件请求时,设置size为每一个小文件的体积
默认: slice 0; 位置: http/server/location平常问题
1、相同 server_name 多个虚拟主机优先级#当显现虚拟主机域名相同的状况,重启nginx时,会显现警告⚠️处理,然则并不不会阻止nginx继续运用server
{ listen 80
; server_name
www.baidu.com
...
}
server { listen 80
; server_name
www.baidu.com
...
}
...
优先选取最新读取到的配置文件,当多个文件是经过include时,文件排序越靠前,越早被读取
2、location 匹配优先级 = #进行普通字符精确匹配,完全匹配 ^~ #进行普通字符匹配,当前暗示前缀匹配~\~*#暗示执行一个正则匹配()#当程序运用精确匹配时,一但匹配成功,将停止其他匹配#当正则匹配成功时,会继续接下来的匹配,寻找是不是还有更精细的匹配
3、try_files的运用
按次序检测文件是不是存在
location / { try_files $uri $uri
/ /index.php;
} #先查询$uri下是不是有文件存在,若存在直接返回给用户#若$url下无文件存在,再次拜访$uri/的路径是不是有文件存在#还是无文件存在,交给index.php处理
例:
location / { root /test
/index.html try_files $uri @test
} location @test
{
proxy_pass http://127.0.0.1:9090;
} #拜访 / 时,查看 /test/index.html 文件是不是存在#若不存在,让9090端口的程序去处理这个请求
4、alias和root的区别location /request_path/image/
{ root /local_path/image/
;
} #当咱们拜访 http://xxx.com/request_path/image/cat.png时#将拜访 http://xxx.com/request_path/image/local_path/image/cat.png 下的文件location /request_path/image/
{ alias/local_path/image/
;
} #当咱们拜访 http://xxx.com/request_path/image/cat.png时#将拜访 http://xxx.com/local_path/image/cat.png 下的文件
5、倘若用户真实IP
当一个请求经过多个代理服务器时,用户的IP将会被代理服务器IP覆盖 #在第1个代理服务器中设置 set x_real_ip=$remote_addr#最后一个代理服务器中获取 $x_real_ip
=IP1
6、Nginx 平常错误码413 Request Entity Too Large #上传文件过大,设置 client_max_body_size503 bad gateway #后端服务无响应504 Gateway Time-out #后端服务执行超时来自:SegmentFault,作者:海岛链接:https://segmentfault.com/a/1190000014893012
扫码关注,不错失任何一个干货
-- 前端技术江湖 --
点赞是最大的支持
|