Nginx 功能特性:
作http服务器,作反响代理服务器,作邮件服务器。
快速响应html请求 ; 支持FastCGI 、 SSL(加密) 、 Virtual Host 、URL Rewrite(重写)、HTTP Basic Auth、 Gzip 压缩。并且支持更多的第三方功能模块的扩展。
nginx 提供的基本服务归纳为三大类等
基本HTTP服务:自拍为http代理服务器和反向代理无服务,支持通过缓存加速访问,可以完成简单的傅在均衡和容错,支持包过滤功能和SSL
高级HTTP服务
邮件服务
nginx 安装目录:
conf 目录 存放nginx 所有的配置文件,其中nginx.conf 是主配置文件;fastcgi 使用fastcgi.conf和fastcgi_params两个文件配置。都提供了.default的默认配置文件供我们恢复到最初。
html 目录 存放了nginx 运行过程中调用的一些html 页面。 index.html页面是初始欢迎页面。50x.html 是Nginx出问题时会调用此页面
logs 目录 日志目录和nginx.pid文件保存nginx 主进程的pid号
sbin 目录 存放一个文件 nginx服务器主程序
nginx 运行时会保持一个主进程和多个worker process 工作进程。 给主进程发送信号就可以控制程序的启停。
信号:
TERM 或者INT 快速停止NGINX服务器
QUT 平缓停止nginx 服务器
HUP 平滑重启
USER1 重新打开日志文件,用于日志切割
USER2 使用新版NGINX 并停止原有NGINX进程,所谓平滑升级。
WINCH 信号用于发送平滑停止旧服务信号。
kill 信号 PID 向NGINX发送信号。 记住 kill 可以用于发送信号!
启动Nginx -g 直接在安装目录sbin目录下运行nginx就行。或者放到环境变量里。
停止Nginx -g QUT | INT | TERM 或者直接Kill -9 nginx PID 强制关闭
平滑重启 Nginx -g HUP
nginx.conf
文件结构
#全局块
events #事件块
{
…
}
http #http 全局块
{
…
server #server全局块
{
…
location #location块
{
…
}
}
server
{
…
location
{
…
}
}
}
遵循就近原则,比如低的和高的两个配置一样,按照低的走。
整个全局块中
user nginx nginx; nginx用户 用户组
worker_processes 8; 工作进程
pid logs/nginx.pid; pid存放路径
错误日志存放路径可以在全局、http、server中配置
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info; 设置级别后 文件需对用户由写权限。
worker_rlimit_nofile 65535;
指定进程可以打开的最大描述符:数目。
这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
现在在Linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
include file; 引入配置文件支持相对路径
accept_mutex on | off;请求序列化 只能在events模块中
multi_accept on | off 是否同时接收多个网络连接 默认关闭events 模块中, 关闭旧是每个worker进程只接收一个新到达的网络连接。
use epoll | poll | select |rtsig 设置驱动模型, 只能在events 模块中。
worker_connections number 设置每一个worker 进程同时开启的最大连接数。
定义MIME_TYPE (网络资源媒体类型,nginx作为web服务器要能识别前端请求的资源类型)
include mime.tpye;
default type application/octet-stream;
上面include引入了
types{ #tpyes 块 可以在http、server、location块中配置。
text/html html htm shtml;
…
image/gif gif;
…
application/x-javascript js;
…
audio/midi mid midi kar;
…
video/3gpp 3gpp 3gp;
}
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer" ’
‘“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for”’;
log_format log404 ‘ s t a t u s [ status [ status[time_local] $remote_addr h o s t host hostrequest_uri $sent_http_location’;
日志格式设置。
r e m o t e a d d r 与 remote_addr与 remoteaddr与http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从那个页面链接访问过来的;
h t t p u s e r a g e n t : 记 录 客 户 浏 览 器 的 相 关 信 息 ; 通 常 w e b 服 务 器 放 在 反 向 代 理 的 后 面 , 这 样 就 不 能 获 取 到 客 户 的 I P 地 址 了 , 通 过 http_user_agent:记录客户浏览器的相关信息; 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过 httpuseragent:记录客户浏览器的相关信息; 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
log_format 用于定义服务日志格式
access_log logs/host.access.log main;
access_log logs/host.access.404.log log404;
sendfile on;
keepalive_timeout 60; 连接超时时间。http
listen 80; server 块
server_name image.***.com; server块
配置访问域名
主机名还可以捕获正则
服务器匹配location时候 先按照标准uri匹配,如果有多个就记录匹配都最高的。 然后再用location块中正则uri匹配,第一个匹配成功的结束搜索用这个location块处理。如果正则匹配错误就用刚才记录的匹配度最高的。
root path 配置根目录 可以在http 、server 、location 中设置 比如 location /data/ root pag 时候收到 /data/index.html 会在 pag/data里面找index.html响应请求
index file.html 设置默认首页。
error_page 404 /404.html 设置粗无页面
alias 改变location接收到的URI的《请求路径》。
IPv4 有7个参数
CPU优化有2个参数
gizp on ;
gizp buffers number size; gzip使用缓存空间的大小。number缓存空间个数。 size每个的大小。 32 4K
gizp_comp_level ; 越高消耗越高压缩越大。默认1
gizp_disable ;针对不同客户端选择开启或者关闭GIZP功能。
Rewrite 重定向
upstream 是后端服务器组的主要指令。
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;
}
rewrite ^/(.*) http://www.baidu.com/ permanent(301永久重定向) last(本条规则匹配完成后继续向下匹配新的location URI规则)break(本条规则匹配完成后终止,不在匹配任何规则)redirect(临时重定向);
# 匹配成功后跳转到百度,执行永久301跳转 server location if 块中