什么是Nginx
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协定下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中体现较好,中国大陆应用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
Nginx的次要作用又是什么
1. 负载平衡
负载平衡是高可用网络基础架构的要害组件,通常用于将工作负载散布到多个服务器来进步网站、利用、数据库或其余服务的性能和可靠性
上图来解释一下吧
比方我本人创立了一个网站,分享一些学习心得之类的货色,一开始的时候拜访数量少,那么一台服务器就能够撑持,然而起初有一天我忽然成为大明星,那么这时候有很多人想要拜访我的网站,慢慢的一台服务器不足以解决大量的申请,这时候就须要减少服务器来减缓压力,如果我减少了两台服务器,我不能让拜访的人须要记住3个域名吧,就比方百度,他也有很多台服务器,然而咱们只须要记住百度就能够了,那么这是怎末做到的呢?
这个时候呢我就能够在搭建一台新的Nginx服务器,让所有的申请都先来拜访Nginx服务器,而后在由Nginx派发解决申请到其余服务器上Nginx是不解决申请的,他只是依据不同的策略来派发到不同的服务器上
,这样是不是就解决了问题,用户只须要记住一个域名,而且申请量增大的时候也不会导致服务器宕机
1.1 负载平衡策略
从下面咱们晓得了Nginx是能够依据不同的策略来派发解决申请的,那么都有什么策略呢?
-
轮询(默认)
每个申请按工夫程序逐个调配到不同的后端服务器,如果后端服务器宕机,能主动剔除
-
指定权重
指定轮询几率,weight和拜访比率成正比,用于后端服务器性能不均的状况
-
ip_hash
指定负载均衡器依照基于客户端IP的调配形式,这个办法确保了雷同的客户端的申请始终发送到雷同的服务器,以保障session会话。这样每个访客都固定拜访一个后端服务器,能够解决session不能跨服务器的问题
-
least_conn(最小连接数)
把申请转发给连接数较少的后端服务器。轮询算法是把申请均匀的转发给各个后端,使它们的负载大致相同;然而,有些申请占用的工夫很长,会导致其所在的后端负载较高。这种状况下,least_conn这种形式就能够达到更好的负载平衡成果
-
第三方策略 第三方的负载平衡策略的实现须要装置第三方插件
-
fair
依照服务器端的响应工夫来调配申请,响应工夫短的优先调配
-
url_hash
拜访url的hash后果来调配申请,使每个url定向到同一个后端服务器,要配合缓存命中来应用。同一个资源屡次申请,可能会达到不同的服务器上,导致不必要的屡次下载,缓存命中率不高,以及一些资源工夫的节约。而应用url_hash,能够使得同一个url(也就是同一个资源申请)会达到同一台服务器,一旦缓存住了资源,再此收到申请,就能够从缓存中读取
-
1.2 负载平衡策略的配置文件
- 轮询
这个的作用就是服务器的一个汇合,所有会被Nginx派发工作的服务器在这里配置
upstream是固定值 nodes 这个是随便的名字然而要跟上面的server.ocation.proxy_pass 中http后的名字统一
upstream nodes {
server 192.168.1.11;
server 192.168.1.12;
}
server {
listen 80; //监听的端口号
server_name 127.0.0.1; //Nginx 服务器地址
location / { // / 示意所有的申请
proxy_pass http://nodes; //被转发的服务器地址
}
- 权重
upstream nodes {
server 192.168.1.11 weight=3; //weight 默认值是1数值越大,代表被被拜访的次数也会越多
server 192.168.1.12 weight=10;
}
server {
listen 80; //监听的端口号
server_name 127.0.0.1; //Nginx 服务器地址
location / { // / 示意所有的申请
proxy_pass http://nodes; //被转发的服务器地址
}
- least_conn(最小连接数)
upstream nodes {
least_conn; //请连接数较少的后端服务器
server 192.168.1.11; //weight 默认值是1数值越大,代表被被拜访的次数也会越多
server 192.168.1.12;
}
server {
listen 80; //监听的端口号
server_name 127.0.0.1; //Nginx 服务器地址
location / { // / 示意所有的申请
proxy_pass http://nodes; //被转发的服务器地址
}
- ip_hash
upstream nodes {
ip_hash; //申请按拜访ip的hash后果调配
server 192.168.1.11; //weight 默认值是1数值越大,代表被被拜访的次数也会越多
server 192.168.1.12;
}
server {
listen 80; //监听的端口号
server_name 127.0.0.1; //Nginx 服务器地址
location / { // / 示意所有的申请
proxy_pass http://nodes; //被转发的服务器地址
}
- fair
upstream nodes {
server 192.168.1.11; //weight 默认值是1数值越大,代表被被拜访的次数也会越多
server 192.168.1.12;
fair;//后端服务器的响应工夫来调配申请,响应工夫短的优先调配
}
server {
listen 80; //监听的端口号
server_name 127.0.0.1; //Nginx 服务器地址
location / { // / 示意所有的申请
proxy_pass http://nodes; //被转发的服务器地址
}
- url_hash
upstream nodes {
server 192.168.1.11; //weight 默认值是1数值越大,代表被被拜访的次数也会越多
server 192.168.1.12;
hash $request_uri;
hash_method crc32;//按拜访url的hash后果来调配申请,使每个url定向到同一个后端服务器
}
server {
listen 80; //监听的端口号
server_name 127.0.0.1; //Nginx 服务器地址
location / { // / 示意所有的申请
proxy_pass http://nodes; //被转发的服务器地址
}
以上文件都是在nginx.conf外面配置
反向代理
代理:在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象管制原对象的援用
在说反向代理前先说一下什么是正向代理?
1.1 正向代理
举个例子阐明一下吧 ,有一天我要去理发,而后我到了理发店之后说,我要找王Tony给我理发
其实这就是正向代理,明确的晓得本人的指标是什么
1.2 反向代理
还是举个例子,我还是去理发店理发,不过我是第一次来,我说给我理个最便宜的,这时候我并不知道谁要来给我理发,然而只有能给理发就能够了
这就是反向代理,我不关怀解决申请的是谁,你只有把我要的后果给我就好了
反向代理和正向代理的区别就是,正向代理客户端,反向代理服务器
反向代理的配置
server {
listen 80;
server_name localhost; //Nginx 地址
location / {
proxy_pass http://123.123.123.123.com //要代理的服务器地址
index index.html index.htm index.jsp;
}
}
配置完这个当前,重启Nginx 在浏览器中输出localhost:80(80能够不必输出),就能够间接拜访到服务器了
这就是反向代理
Nginx 配置文件的根本配置
user nginx nginx ;
Nginx用户及组:用户 组。window下不指定
worker_processes 8;
工作过程:数目。依据硬件调整,通常等于CPU数量或者2倍于CPU。
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
谬误日志:寄存门路。
pid logs/nginx.pid;
pid(过程标识符):寄存门路。
worker_rlimit_nofile 204800;
指定过程能够关上的最大描述符:数目。
这个指令是指当一个nginx过程关上的最多文件描述符数目,理论值应该是最多关上文件数(ulimit -n)与nginx过程数相除,然而nginx调配申请并不是那么平均,所以最好与ulimit -n 的值保持一致。
当初在linux 2.6内核下开启文件关上数为65535,worker_rlimit_nofile就相应应该填写65535。
这是因为nginx调度时调配申请到过程并不是那么的平衡,所以如果填写10240,总并发量达到3-4万时就有过程可能超过10240了,这时会返回502谬误。
events
{
use epoll;
应用epoll的I/O 模型。linux倡议epoll,FreeBSD倡议采纳kqueue,window下不指定。
补充阐明:
与apache相类,nginx针对不同的操作系统,有不同的事件模型
A)规范事件模型
Select、poll属于规范事件模型,如果以后零碎不存在更无效的办法,nginx会抉择select或poll
B)高效事件模型
Kqueue:应用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.应用双处理器的MacOS X零碎应用kqueue可能会造成内核解体。
Epoll:应用于Linux内核2.6版本及当前的零碎。
/dev/poll:应用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
Eventport:应用于Solaris 10。 为了防止出现内核解体的问题, 有必要装置安全补丁。
worker_connections 204800;
没个工作过程的最大连贯数量。依据硬件调整,和后面工作过程配合起来用,尽量大,然而别把cpu跑到100%就行。每个过程容许的最多连接数,实践上每台nginx服务器的最大连接数为。worker_processes*worker_connections
keepalive_timeout 60;
keepalive超时工夫。
client_header_buffer_size 4k;
客户端申请头部的缓冲区大小。这个能够依据你的零碎分页大小来设置,个别一个申请头的大小不会超过1k,不过因为个别零碎分页都要大于1k,所以这里设置为分页大小。
分页大小能够用命令getconf PAGESIZE 获得。
[root@web001 ~]# getconf PAGESIZE
4096
但也有client_header_buffer_size超过4k的状况,然而client_header_buffer_size该值必须设置为“零碎分页大小”的整倍数。
open_file_cache max=65535 inactive=60s;
这个将为关上文件指定缓存,默认是没有启用的,max指定缓存数量,倡议和关上文件数统一,inactive是指通过多长时间文件没被申请后删除缓存。
open_file_cache_valid 80s;
这个是指多长时间查看一次缓存的无效信息。
open_file_cache_min_uses 1;
open_file_cache指令中的inactive参数工夫内文件的起码应用次数,如果超过这个数字,文件描述符始终是在缓存中关上的,如上例,如果有一个文件在inactive工夫内一次没被应用,它将被移除。
}
##设定http服务器,利用它的反向代理性能提供负载平衡反对
http
{
include mime.types;
设定mime类型,类型由mime.type文件定义
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';
日志格局设置。
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录拜访工夫与时区;
$request: 用来记录申请的url与http协定;
$status: 用来记录申请状态;胜利是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从那个页面链接拜访过去的;
$http_user_agent:记录客户浏览器的相干信息;
通常web服务器放在反向代理的前面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发申请的http头信息中,能够减少x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的申请的服务器地址。
access_log logs/host.access.log main;
access_log logs/host.access.404.log log404;
用了log_format指令设置了日志格局之后,须要用access_log指令指定日志文件的寄存门路;
server_names_hash_bucket_size 128;
#保留服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所管制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在缩小了在内存中的存取次数后,使在处理器中减速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的状况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因而,如果Nginx给出须要增大hash max size 或 hash bucket size的提醒,那么首要的是增大前一个参数的大小.
client_header_buffer_size 4k;
客户端申请头部的缓冲区大小。这个能够依据你的零碎分页大小来设置,个别一个申请的头部大小不会超过1k,不过因为个别零碎分页都要大于1k,所以这里设置为分页大小。分页大小能够用命令getconf PAGESIZE获得。
large_client_header_buffers 8 128k;
客户申请头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果
header过大,它会应用large_client_header_buffers来读取。
open_file_cache max=102400 inactive=20s;
这个指令指定缓存是否启用。
例: open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
open_file_cache_errors
语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 应用字段:http, server, location 这个指令指定是否在搜寻一个文件是记录cache谬误.
open_file_cache_min_uses
语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 应用字段:http, server, location 这个指令指定了在open_file_cache指令有效的参数中肯定的工夫范畴内能够应用的最小文件数,如果应用更大的值,文件描述符在cache中总是关上状态.
open_file_cache_valid
语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 应用字段:http, server, location 这个指令指定了何时须要查看open_file_cache中缓存我的项目的无效信息.
client_max_body_size 300m;
设定通过nginx上传文件的大小
sendfile on;
sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 形式)来输入文件,对于一般利用,必须设为on。如果用来进行下载等利用磁盘IO重负载利用,可设置为off,以均衡磁盘与网络IO处理速度,升高零碎uptime。
tcp_nopush on;
此选项容许或禁止应用socke的TCP_CORK的选项,此选项仅在应用sendfile的时候应用
proxy_connect_timeout 90;
后端服务器连贯的超时工夫_发动握手等待响应超时工夫
proxy_read_timeout 180;
连贯胜利后_等待后端服务器响应工夫_其实曾经进入后端的排队之中等待解决(也能够说是后端服务器解决申请的工夫)
proxy_send_timeout 180;
后端服务器数据回传工夫_就是在规定工夫之内后端服务器必须传完所有的数据
proxy_buffer_size 256k;
设置从被代理服务器读取的第一局部应答的缓冲区大小,通常状况下这部分应答中蕴含一个小的应答头,默认状况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过能够将其设置为更小
proxy_buffers 4 256k;
设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认状况也为分页大小,依据操作系统的不同可能是4k或者8k
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
设置在写入proxy_temp_path时数据的大小,预防一个工作过程在传递文件时阻塞太长
proxy_temp_path /data0/proxy_temp_dir;
proxy_temp_path和proxy_cache_path指定的门路必须在同一分区
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置内存缓存空间大小为200MB,1天没有被拜访的内容主动革除,硬盘缓存空间大小为30GB。
keepalive_timeout 120;
keepalive超时工夫。
tcp_nodelay on;
client_body_buffer_size 512k;
如果把它设置为比拟大的数值,例如256k,那么,无论应用firefox还是IE浏览器,来提交任意小于256k的图片,都很失常。如果正文该指令,应用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就呈现了。
无论应用firefox4.0还是IE8.0,提交一个比拟大,200k左右的图片,都返回500 Internal Server Error谬误
proxy_intercept_errors on;
示意使nginx阻止HTTP应答代码为400或者更高的应答。
upstream bakend {
server 127.0.0.1:8027;
server 127.0.0.1:8028;
server 127.0.0.1:8029;
hash $request_uri;
}
nginx的upstream目前反对4种形式的调配
1、轮询(默认)
每个申请按工夫程序逐个调配到不同的后端服务器,如果后端服务器down掉,能主动剔除。
2、weight
指定轮询几率,weight和拜访比率成正比,用于后端服务器性能不均的状况。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
2、ip_hash
每个申请按拜访ip的hash后果调配,这样每个访客固定拜访一个后端服务器,能够解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
3、fair(第三方)
按后端服务器的响应工夫来调配申请,响应工夫短的优先调配。
upstream backend {
server server1;
server server2;
fair;
}
4、url_hash(第三方)
按拜访url的hash后果来调配申请,使每个url定向到同一个后端服务器,后端服务器为缓存时比拟无效。
例:在upstream中退出hash语句,server语句中不能写入weight等其余的参数,hash_method是应用的hash算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
tips:
upstream bakend{#定义负载平衡设施的Ip及设施状态}{
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在须要应用负载平衡的server中减少
proxy_pass http://bakend/;
每个设施的状态设置为:
1.down示意单前的server临时不参加负载
2.weight为weight越大,负载的权重就越大。
3.max_fails:容许申请失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的谬误
4.fail_timeout:max_fails次失败后,暂停的工夫。
5.backup: 其它所有的非backup机器down或者忙的时候,申请backup机器。所以这台机器压力会最轻。
nginx反对同时设置多组的负载平衡,用来给不必的server来应用。
client_body_in_file_only设置为On 能够讲client post过去的数据记录到文件中用来做debug
client_body_temp_path设置记录文件的目录 能够设置最多3层目录
location对URL进行匹配.能够进行重定向或者进行新的代理 负载平衡
##配置虚拟机
server
{
listen 80;
配置监听端口
server_name image.***.com;
配置拜访域名
location ~* \.(mp3|exe)$ {
对以“mp3或exe”结尾的地址进行负载平衡
proxy_pass http://img_relay$request_uri;
设置被代理服务器的端口或套接字,以及URL
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
以上三行,目标是将代理服务器收到的用户的信息传到实在服务器上
}
location /face {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
proxy_pass http://img_relay$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
error_page 404 502 = @fetch;
}
location @fetch {
access_log /data/logs/face.log log404;
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
location /image {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
proxy_pass http://img_relay$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
error_page 404 502 = @fetch;
}
location @fetch {
access_log /data/logs/image.log log404;
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
}
##其余举例
server
{
listen 80;
server_name *.***.com *.***.cn;
location ~* \.(mp3|exe)$ {
proxy_pass http://img_relay$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;
}
proxy_pass http://img_relay$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#error_page 404 http://i1.***img.com/help/noimg.gif;
error_page 404 502 = @fetch;
}
location @fetch {
access_log /data/logs/baijiaqi.log log404;
rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;
}
}
server
{
listen 80;
server_name *.***img.com;
location ~* \.(mp3|exe)$ {
proxy_pass http://img_relay$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif;
}
proxy_pass http://img_relay$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#error_page 404 http://i1.***img.com/help/noimg.gif;
error_page 404 = @fetch;
}
#access_log off;
location @fetch {
access_log /data/logs/baijiaqi.log log404;
rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;
}
}
server
{
listen 8080;
server_name ngx-ha.***img.com;
location / {
stub_status on;
access_log off;
}
}
server {
listen 80;
server_name imgsrc1.***.net;
root html;
}
server {
listen 80;
server_name ***.com w.***.com;
# access_log /usr/local/nginx/logs/access_log main;
location / {
rewrite ^(.*)$ http://www.***.com/ ;
}
}
server {
listen 80;
server_name *******.com w.*******.com;
# access_log /usr/local/nginx/logs/access_log main;
location / {
rewrite ^(.*)$ http://www.*******.com/;
}
}
server {
listen 80;
server_name ******.com;
# access_log /usr/local/nginx/logs/access_log main;
location / {
rewrite ^(.*)$ http://www.******.com/;
}
}
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#设定查看Nginx状态的地址
location ~ /\.ht {
deny all;
}
#禁止拜访.htxxx文件
}
正文:变量
Ngx_http_core_module模块反对内置变量,他们的名字和apache的内置变量是统一的。
首先是阐明客户申请title中的行,例如$http_user_agent,$http_cookie等等。
此外还有其它的一些变量
$args此变量与申请行中的参数相等
$content_length等于申请行的“Content_Length”的值。
$content_type等同与申请头部的”Content_Type”的值
$document_root等同于以后申请的root指令指定的值
$document_uri与$uri一样
$host与申请头部中“Host”行指定的值或是request达到的server的名字(没有Host行)一样
$limit_rate容许限度的连贯速率
$request_method等同于request的method,通常是“GET”或“POST”
$remote_addr客户端ip
$remote_port客户端port
$remote_user等同于用户名,由ngx_http_auth_basic_module认证
$request_filename以后申请的文件的路径名,由root或alias和URI request组合而成
$request_body_file
$request_uri含有参数的残缺的初始URI
$query_string与$args一样
$sheeme http模式(http,https)尽在要求是评估例如
Rewrite ^(.+)$ $sheme://example.com$; Redirect;
$server_protocol等同于request的协定,应用“HTTP/或“HTTP/
$server_addr request达到的server的ip,个别取得此变量的值的目标是进行零碎调用。为了防止零碎调用,有必要在listen指令中指明ip,并应用bind参数。
$server_name申请达到的服务器名
$server_port申请达到的服务器的端口号
$uri等同于以后request中的URI,可不同于初始值,例如外部重定向时或应用index
明天就说到这里吧
大家如果有趣味能够关注我的公众号
发表回复