Nginx 是一款轻量级高性能的的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强。事实上 Nginx 的并发能力在同类型的网页服务器中表现较好。
一、常用命令
# 查看配置文件是否正确
nginx -t
# 重载配置
nginx -s reload
# 重启
nginx -s reopen
# 停止
nginx -s stop
二、配置文件详解
基本就分为以下几块:
main
events {
....
}
http {
....
upstream myproject {
.....
}
server {
....
location {
....
}
}
server {
....
location {
....
}
}
....
}
以上我们可以看出,Nginx 配置文件主要分为六个区域:
1、main (全局设置)
2、events (nginx工作模式)
3、http (http设置)
4、sever (主机设置)
5、location (URL匹配)
6、upstream (负载均衡服务器设置)
1、main 模块
下面是一个 main 区域,他是一个全局的设置:
# 指定 Nginx Worker 进程运行用户以及用户组,默认由 nobody 账号运行
user nobody nobody;
# 指定 Nginx 要开启的进程数,建议设置为等于CPU总核心数
worker_processes 2;
# 定义全局错误日志文件。类型:[ debug | info | notice | warn | error | crit ]
error_log /usr/local/var/log/nginx/error.log notice;
# 指定进程 id 的存储文件位置
pid /usr/local/var/run/nginx/nginx.pid;
# 指定进程可以打开的最大描述符:数目
# 工作模式与连接数上限
# 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
# 现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
# 这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
worker_rlimit_nofile 1024;
2、events 模块
events 模块来用指定 Nginx 的工作模式和工作模式及连接数上限,一般是这样:
events {
# 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
# 是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
# 补充说明:
# 与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。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
use epoll;
# 定义 Nginx 每个进程的最大连接数
worker_connections 1024;
}
3、http 模块
http 模块可以说是最核心的模块了,它负责 HTTP 服务器相关属性的配置。
http{
# 用来设定文件的 mime 类型,来告诉 nginx 来识别文件类型
include mime.types;
# 设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式
default_type application/octet-stream;
# 设置日志的格式,和记录哪些参数,这里设置为 main 类型的日志
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 记录每次的访问日志的文件地址,后面的 main 是日志的格式样式,对应于 log_format 的 main
access_log /usr/local/var/log/nginx/access.log main;
# 开启高效文件传输模式
sendfile on;
# 设置为 on 用于防止网络阻塞
tcp_nopush on;
# 设置为 on 用于防止网络阻塞
tcp_nodelay on;
# 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接
keepalive_timeout 10;
# gzip on;
upstream myproject {
.....
}
server {
....
}
}
4、server 模块
sever 模块是 http 的子模块,它用来定一个虚拟主机。
server {
# 指定虚拟主机的服务端口
listen 8080;
# 指定IP地址或者域名,多个域名之间用空格分开
server_name localhost 192.168.0.66 www.pengyunjing.com;
# root 表示在这整个 server 虚拟主机内,全部的 root web 根目录。注意要和 locate {} 下面定义的区分开来
root /Users/pengyunjing/www;
# index 全局定义访问的默认首页地址。注意要和 locate {} 下面定义的区分开来
index index.php index.html index.htm;
# 设置网页的默认编码格式
charset utf-8;
# 指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式
access_log usr/local/var/log/host.access.log main;
error_log usr/local/var/log/host.error.log error;
....
}
5、location 模块
location 模块是 Nginx 中用的最多的,负载均衡、反向代理、虚拟域名等都会用到。它提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过 location 指令实现 Nginx 对网页进行过滤处理。
设定默认首页和虚拟机目录:
location / { # 表示匹配访问根目录
# 指定访问根目录时,虚拟主机的 web 目录
root /Users/pengyunjing/www;
# 设定我们只输入域名后访问的默认首页地址
index index.php index.html index.htm;
}
正则匹配来链接php:
location ~ \.php$ {
root /Users/pengyunjing/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
6、upstream 模块
upstream 模块负责负载均衡模块,通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡。
upstream pengyunjing {
ip_hash;
server 192.168.0.1:80;
server 192.168.0.2:80 down;
server 192.168.0.3:8080 max_fails=3 fail_timeout=20s;
server 192.168.0.4:8080;
}
在上面的例子中,通过 upstream 指令指定了一个负载均衡器的名称 pengyunjing。这个名称可以任意指定,在后面需要的地方直接调用即可。
里面是 ip_hash 这是其中的一种负载均衡调度算法,下面会着重介绍。紧接着就是各种服务器了。用 server 关键字表识,后面接 ip。
Nginx 的负载均衡模块目前支持4种调度算法:
1)weight 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight 指定轮询权值,值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
2)ip_hash
每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。
3)fair
比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx 的 upstream_fair 模块。
4)url_hash
按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包。
在 upstream 模块中,可以通过 server 指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
- down,表示当前的 server 暂时不参与负载均衡。
- backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻。
- max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
- fail_timeout,在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。
注意 当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是 weight 和 backup。