Nginx专题
1 安装步骤
1、打开终端
2、安装Command Line tools
xcode-select --install
3、安装brew命令
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
4、安装nginx
brew install nginx
5、启动nginx
sudo nginx
OK, nginx就安装好了,可以在浏览器访问了,默认端口为8080,
在浏览器输入http://localhost:8080/ 就能看到nginx在本计算机搭建的服务器
2 Nginx管理
2.1 操作命令
nginx常用命令如下:
启动nginx:
sudo nginx
判断配置文件是否正确:
sudo nginx -t
停止nginx:
sudo nginx -s stop
重启nginx:
sudo nginx -s reload
2.2 nginx.conf配置详解
#定义Nginx运行的用户和用户组,来指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行
user ***;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 4;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ],其中debug输出日志最为最详细,而crit输出日志最少
error_log logs/error.log info;
#进程文件,用来指定进程id的存储文件位置
pid logs/nginx.pid;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致,可以使用命令“ulimit -n 65535”来设置其他值。
worker_rlimit_nofile 4864;
#工作模式与连接数上限
events {
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll; #mac平台用kqueue,对于Linux系统,epoll工作模式是首选
#worker_connections用于定义Nginx每个进程的最大连接数,即接收前端的最大请求数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即Max_clients=worker_processes*worker_connections,在作为反向代理时,Max_clients变为:Max_clients = worker_processes * worker_connections/4。进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效
worker_connections 1024;
}
#设定http服务器
http {
#来用设定文件的mime类型,类型在配置文件目录下的mime.type文件定义,来告诉nginx来识别文件类型。
include mime.types;
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
#用于设置日志的格式,和记录哪些参数,这里设置为main,刚好用于access_log来纪录这种类型
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
#'$status $body_bytes_sent "$http_referer" '
#'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
upstream blog.ha97.com {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
#虚拟主机的配置
server {
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.***.com ***.com;
index index.html index.htm index.php;
#表示在这整个server虚拟主机内,全部的root web根目录。注意要和locate {}下面定义的区分开来
root /data/www/***;
location /mp/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
location / {
proxy_pass http://192.168.200.248:80;
proxy_set_header Host $host;
}
add_header Access-Control-Allow-Origin "*";
}
}
2.3 负载均衡配置
2.3.1 负载均衡算法
在负载反向代理的算法上,共有六种:轮询、ip_hash、weight、fair(第三方)、url_hash(第三方)、cookie。
轮询是默认的,每一个请求按顺序逐一分配到不同的后端服务器,如果后端服务器down掉了,则能自动剔除。Nginx默认采用round_robin加权算法。如果要选择其他的负载均衡算法,必须在upstream的配置上下文中通过配置指令ip_hash明确指定(该配置项最好放在其他server指令等的前面,以便检查server的配置选项是否合理)。
weight
是设置权重,用于后端服务器性能不均的情况,访问比率约等于权重之比。
upstream freeoa {
server 172.18.0.5:81 weight=1;
servse 172.18.0.3:80 weight=5;
}
ip_hash
解决了session问题:每个请求按访问IP的hash结果分配,这样每个访客可以固定一个后端服务器。
upstream freeoa {
ip_hash;
server 172.18.0.5:81;
servse 172.18.0.3:80;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream freeoa {
server 172.18.0.5:81;
server 172.18.0.3:80;
fair;
}
url_hash (第三方)
按访问URL的hash结果来分配请求,使每个URL定向到同一个后端服务器,后端服务器为缓存时比较适用。另外,在upstream中加入hash语句后,server语句不能写入weight等其他参数。
upstream freeoa {
server squid_ip1:3128;
server squid_ip2:3128;
hash $request_uri;
hash_method crc32;
}
upstream freeoa {
ip_hash;
server 172.18.0.5:81;down
server 172.18.0.4:80 weight=2 max_fails=2 fail_timeout=30s;
server 172.18.0.3:80 backup;
}
其它相关指令介绍
down
暂时不参与负载
weight
权重
max_fail
允许请求失败的次数,默认为1
fail_timeout max_fail
次失败后,暂停的时间
backup
所有其他非backup机器down或者忙的时候,才请求backup,所以这台机器压力最轻。
nginx负载均衡模块ngx_http_upstream_module允许定义一组服务器,这组服务器可以被proxy_pass,fastcgi_pass和memcached_pass这些指令引用。
设置一个nginx负载均衡服务器的地址和其他参数。一个地址可以被指定为域名或IP地址,和一个可选的端口,或者被定为UNIX-domain套接字文件的路径,使用"unix:"作为前缀。如果端口没指定,则使用80端口。一个被解析到多个IP地址的域名本质上指定了多个服务器。
upstream name {...}
default:-
所属指令:http
定义一组用于实现nginx负载均衡的服务器,它们可以侦听在不同的端口。另外,可以混合使用侦听TCP与UNIX-domain套接字文件。默认情况下,请求被分散在使用加权轮询的nginx负载均衡服务器上。
语法:server 地址[参数];
default:-
所属指令:upstream
可以定义下面的参数:
weight=number
设置服务器的权限,默认是1
max_fails=number
设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,停机时间是fail_timeout设置的时间。默认情况下,不成功连接数被设置为1。被设置为零则表示不进行链接数统计。那些连接被认为是不成功的可以通过proxy_next_upstream, fastcgi_next_upstream,和memcached_next_upstream指令配置。http_404状态不会被认为是不成功的尝试。
fail_time=time
设置多长时间内失败次数达到最大失败次数会被认为服务器停机了服务器会被认为停机的时间长度,默认情况下,超时时间被设置为10S。
max_fails 的默认值为1,fail_timeout的默认值是10s。传输失败的情形,由proxy_next_upstream 或fastcgi_next_upstream 指定。而且可以使用proxy_connect_timeout 和proxy_read_timeout 控制upstream 响应时间。
backup
标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就只使用由backup 标注的备机。必须要注意的是,backup 不能和ip_hash 关键字一起使用。
down
标记服务器永久停机了;与指令ip_hash一起使用。
语法:ip_hash;
default:-
所属指令:upstream
指定nginx负载均衡器组使用基于客户端ip的负载均衡算法。IPV4的前3个八进制位和所有的IPV6地址被用作一个hash key。这个方法确保了相同客户端的请求一直发送到相同的服务器上除非这个服务器被认为是停机。这种情况下,请求会被发送到其他主机上,然后可能会一直发送到这个主机上。如果nginx负载均衡器组里面的一个服务器要临时移除,它应该用参数down标记,来防止之前的客户端IP还往这个服务器上发请求。
注意:在版本1.3.2中开始支持IPV6地址,在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
语法:keepalive 连接数;
default:-
所属模块:upstream这个指令在版本1.1.4中出现
nginx 负载均衡器的活动链接数缓存。
连接数(keepalive的值)指定了每个工作进程中保留的持续连接到nginx负载均衡器缓存的最大值。如果超过这个设置值的闲置进程想链接到nginx负载均衡器组,最先连接的将被关闭。
2.3.2 nginx负载均衡器内置变量(Embedded Variables)
nginx负载均衡模块ngx_http_upstream_module支持下列内置变量:
$upstream_addr
保存一个服务器的IP地址和端口号或者UNIX-domain套接字文件的路径。如果在处理请求过程中使用了多个服务器,那么它们的地址将以逗号分割,例如:“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。如果一个内置的从一个服务器组到另一个服务器组的重定向使用X-Accel-Redirect” or error_page ,那么那些服务器组以冒号隔开,例如“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。
$upstream_response_time
保存nginx负载均衡服务器响应时间,以毫秒计。多个响应也以逗号和冒号隔开。
$upstream_status
保存nginx负载均衡服务器响应代码。多个响应代码也以逗号或冒号隔开。
$upstream_http_
保存nginx负载均衡服务器响应头字段。例如,the “Server” response header field is made available through the $upstream_http_server variable.注意,只有最后一个服务器响应头字段被保存。
2.3.3 基于cookie的负载均衡模块-sticky
像一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能保证每次访问都粘滞在同一台服务器。如果基于cookie的, 每台电脑都会有不同的cookie,在保持长连接的同时还保证了服务器的压力均衡,nginx sticky值得推荐。
如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现的。
配置nginx sticky
nginx 的upstream使用sticky,如下
upstream freeoa{
sticky;
server 192.168.100.209:80;
server 192.168.100.225:80;
}
sticky 其它语法
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
name: 可以为任何的string字符,默认是route
domain:哪些域名下可以使用这个cookie
path:哪些路径对启用sticky,例如path/test,那么只有test这个目录才会使用sticky做负载均衡
expires:cookie过期时间,默认浏览器关闭就过期,也就是会话方式。
no_fallbackup:如果设置了这个,cookie对应的服务器宕机了,那么将会返回502(bad gateway 或者proxy error),建议不启用
sticky expires用法
upstream freeoa {
sticky expires=1h;
server 172.18.0.209:80;
server 172.18.0.225:80;
}
注意:sticky模块不能与ip_hash同时使用。
3 参考链接
https://www.cnblogs.com/tandaxia/p/8810648.html
mac下配置nginx
https://www.cnblogs.com/hzdx/p/nginx_seting.html
https://www.cnblogs.com/malcolmfeng/p/6902635.html
Mac下tomcat+nginx试验负载均衡简单模拟
https://blog.csdn.net/lanqibaoer/article/details/72853056
(Good)Nginx负载均衡配置策略
http://www.freeoa.net/osuport/cluster/nginx-load-equilibrium-configuration-strategy_1652.html