Nginx的核心模块为Main和Events,此外还包括标准HTTP模块、可选HTTP模块和邮件模块,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块,HTTP模块用于控制Nginx的HTTP进程。Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。
由上我们了解到,nginx的配置由指令已经参数构成,下面我们就来介绍下nginx常用指令的使用。
main上下文指令
user
定义Nginx运行的用户和用户组用user指令
user www-data;
定义nginx进程数,用worker_processes指令,建议设置为等于CPU总核心数。
worker_processes 2;
全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]用error_log指令。另外日志还可以定义在http、server及location上下文中,语法格式一样。全局日志会被http,server等具体的日志配置所覆盖。这一定与html中样式的作用域类似。
error_log /var/log/nginx/error.log info;
定义进程文件用pid指令
pid /var/run/nginx.pid;
event上下文指令
参考事件模型指令:use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];其中,epoll是linx 2.6版本内核中高性能I/O模型。nginx的并非量和采用的时间模型息息相关。真是因为apache 使用了select模型,而nginx默认使用的epoll模型,导致同等条件下,nginx的性能优于apache的性能10倍左右。后面会有专门的文章做详细介绍。例如
use epoll;
http上下文指令
设定mime类型,类型由mime.type文件定义 用include指令.
include /etc/nginx/mime.types;## include指令可以将其他文件的指令引入进来
default_type application/octet-stream;
开启gzip压缩指令
gzip on;
负载均衡服务器列表指令upstream
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
#本机上的Squid开启3128端口
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
server (虚拟主机)上下文指令
server上下文指令,主要设置了端口的舰艇,主机名称,路径路由,虚拟主机日志等
server {
#侦听80端口
listen 80;
#定义使用www.xx.com访问
server_name www.xx.com;
#设定本虚拟主机的访问日志
access_log logs/www.xx.com.access.log main;
#默认请求
location / {
root /root; #定义服务器的默认网站根目录位置
index index.php index.html index.htm; #定义首页索引文件的名称
fastcgi_pass www.xx.com;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location /proxy {
proxy_pass http://otherserver.com; #请求转发指令
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /root;
}
}
nginx的upstream
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称ixdba.net。这个名称可以任意指定,在后面需要的地方直接调用即可。nginx的upstream目前支持4种方式的分配
轮询(默认) : 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash : 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。当然如果这个节点不可用了,会发到下个节点,而此时没有session同步的话就注销掉了。
least_conn
: 请求被发送到当前活跃连接最少的realserver上。会考虑weight的值。
url_hash
: 此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持urlhash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包 nginxupstream_hash 。
fair
: 这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair 模块。
upstream 配置如下;
upstream backend{
ip_hash;
server 192.168.12.133:80;
server 192.168.12.134:80 down;
server 192.168.12.135:8009 max_fails=3 fail_timeout=20s;
server 192.168.12.136:8080 backup;
}
server{
location /{
proxy_pass http://backend;
}
}
Upstream可对后端服务器进行健康检查。
a) down表示当前的server暂时不参与负载。
b) weight默认为1.weight越大,负载的权重就越大。
c) maxfails :在failtimeout时间内对后台服务器请求失败的次数。
d) failtimeout:maxfails次失败后,暂停的时间。
e) backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
使用nginx的sticky模式
这个模块的作用是通过cookie黏贴的方式将来自同一个客户端(浏览器)的请求发送到同一个后端服务器上处理,这样一定程度上可以解决多个backend servers的session同步的问题 —— 因为不再需要同步,而RR轮询模式必须要运维人员自己考虑session同步的实现。
另外内置的 ip_hash
也可以实现根据客户端IP来分发请求,但它很容易造成负载不均衡的情况,而如果nginx前面有CDN网络或者来自同一局域网的访问,它接收的客户端IP是一样的,容易造成负载不均衡现象。淘宝Tengine的 ngxhttpupstreamsessionsticky_module 也是类似的功能。nginx-sticky-module的cookie过期时间,默认浏览器关闭就过期,也就是会话方式。
这个模块并不合适不支持 Cookie 或手动禁用了cookie的浏览器,此时默认sticky就会切换成RR。它不能与ip_hash同时使用。
sticky的配置
配置起来超级简单,一般来说一个sticky指令就够了。sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];:
name: 可以为任何的 string 字符,默认是 routedomain:哪些域名下可以使用这个 cookiepath:哪些路径对启用 sticky,例如 path/test,那么只有 test 这个目录才会使用 sticky 做负载均衡expires:cookie 过期时间,默认浏览器关闭就过期,也就是会话方式。no_fallbackup:如果设置了这个,cookie 对应的服务器宕机了,那么将会返回502(bad gateway 或者 proxy error),建议不启用
upstream backend{
sticky;# 使用该模式可以解决大多数问题
server 192.168.12.133:80;
server 192.168.12.134:80 down;
server 192.168.12.135:8009 max_fails=3 fail_timeout=20s;
server 192.168.12.136:8080 backup;
}