www.nginx.org
Tenginx:Taobao enginx
epoll();
模块化设计,较好扩展性:但不支持模块的动态装卸载;Tenginx支持;
高可靠性
master –> worker
低内存消耗
支持热部署
不停机而跟新配置文件,日志文件滚动,升级程序版本
静态资源的web服务器,能够缓存打开的文件描述符
http,smtp,pop3协议的反向代理服务器
缓存加速、负载均衡机制
支持FastCGI(ftm,LNMP),uWSGI(python)
模块化(非DSO机制)、过滤器zip、SSI及图像的大小调整
支持SSL
代理的概念
正向代理:客户端请求的服务都被代理服务器代替来请求
反向代理:反向代理服务器会帮我们把请求转发到真实的服务器那里去
正向代理代理的对象是客户端,反向代理隐藏了真实的服务端
基于名称和IP的虚拟主机
支持keepalive
支持平滑升级
定制访问日志,支持使用日志缓冲区提供日志存储性能
支持url rewrite
支持路径名称
支持基于IP及用户的访问控制
支持速率限制,支持并发访问数限制
Nginx的架构特性
一个master进程,生存一个或多个worker进程
事件驱动模型:epoll(边缘触发)linux
复用器:select,poll,rt signal
支持sendfile,sendfile64
支持AIO
支持mmap(内存映射)
Nginx的工作模式:非阻塞、事件驱动、由一个master进程生成多个worker线程,每个worker响应n个请求
worker * n
Nginx模块类型:
核心模块
standard HTTP modules
Optional HTTP modules
Mail modeules
3rd party modules
rpm包:epel
源码:编译安装
制作好的程序包:rpm包
PCRE(Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式),实现对URL重写
1.安装所依赖的pcre-devel包
#yum -y install pcre-devel
#groupadd -r nginx
#groupadd -g nginx -r nginx
3.编译
#tar xf nginx-1.6.2.tar.gz
#cd nginx-1.6.2
#./configure –prefix=/usr/local/nginx –conf-path=/etc/nginx/nginx.conf –user=nginx –group=nginx –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx/nginx.pid –lock-path=/var/lock/nginx.lock –with-http_ssl_module –with-http_stub_status_module –with-http_gzip_static_module –with-http_flv_module –with-http_mp4_module –http-client-body-temp-path=/var/tmp/nginx/client –http-proxy-temp-path=/var/tmp/nginx/proxy –http-fastcgi-temp-path=/var/tmp/nginx/fastcgi –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
#make && make install
#mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi}
#/usr/local/nginx/sbin/nginx -t //检查配置文件的语法
#/usr/local/nginx/sbin/nginx
Nginx的配置/etc/nginx/nginx.conf
main配置段:全局配置段
event:定义event模型工作特性
http {}:定义http协议相关的配置
配置指令:要以分好结尾,语法格式:
dirctive value1 [value2…]
支持使用变量
内置变量
模块会提供内建变量的定义
自定义变量
set var_name value
主配置段的指令:
用于调试、定位问题
正常运行必备的配置
优化性能的配置
事件相关的配置
blocking nonblocking mutiplexing event-driven AIO
阻塞I/O 非阻塞I/O 复用性I/O 事件驱动I/O 异步I/O
Nginx: non-blocking event-drive aio
Nginx-1.8的新特性:
hash load balancing method
backend SSL certificate verification
thread pools support
proxy request buffering
主配置段的指令:
正常运行的必备配置
1.user USERNANE [GROUPNAME] //指定运行worker进程的用户和组
user nginx nginx;
2.pid /path/to/pid_file; //指定nginx守护进程的pid文件
pid /var/run/nginx/nginx.pid
3.worker_rlimit_nofile #; //指定所有worker进程所能够打开的最大文件句柄数
4.worker_rlimit_core size;
5.
性能优化相关的配置
1.worker_processes #; //指明worker进程的个数,通常略应该少于cpu物理核心数
2.worker_cpu_affinity cpumask …; //避免不了context switch,会提升缓存命中率;将worker进程绑定到指定的cpu上运行
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
4.timer_resolution interval; //计时器解析度,降低此值,可减少gettimeofday()系统调用次数;
5.worker_priority number; //指明worker进程的nice值 -20–19
事件相关的配置
1.accept_mutex {off|on};
master调度用户请求至各worker进程时使用的负载均衡锁:on表示能让多个worker轮流地 序列化的响应请求
2.lock_file file;
accept_metex用到的锁文件路径
3.use method;
use [epoll|rtsig|select|poll] 指明使用的事件模型,建议让Nginx自行选择;
4.worker_connections #;
设定单个worker进程所能够处理的最大并发连接数量
用于调试、定位问题:要使用debug级别,编译时要启用–with-debug选项
1.daemon {on|off} 是否以守护进程方式运行nginx,调试时应该设置为off
2.master_process {on|off} 是否以master/worker模型来运行Nginx;调试时可以设置为off
3.error_log file [level];
总结:常需要进行调整的参数
worker_precess worker_connections worker_cpu_affinity worker_priority
#nginx -s stop|reload|quit|reopne
Nginx做为web服务器时使用的配置
http{}:由ngx_http_core_module模块所引入
配置框架:
http {
upstream {
}
server {
location URL {
root “/path/to/somedir”; //指定本地文件系统路径;
if … {
}//if语句
}//类似于http中的<location>,用于定义URL于本地文件系统的映射关系;可以使用多次
} //每个server类似于httpd中的一个<VirtualHost>;server可以使用多次;
}
文中的某种
配置指令:
1.server {} //定义一个虚拟主机;
server {
listen 8080; //监听的端口
server_name www.xiangx.com; //主机名称
root “/web/www/html”; //类似DcoumentRoot
}
注意:提供root对应的文件
#/usr/local/nginx/sbin/nginx -t //检查配置文件的语法
#/usr/local/nginx/sbin/nginx -s reload //重载配置文件
测试访问
2.listen //监听指定的地址和端口
listen address[:port];
listen port;
3.server_name NAME […];
后可以跟多个主机:名称还可以使用正则表达式或通配符;
(1)先做精确匹配检查;
(2)左侧通配符匹配检查;
(3)右侧通配符匹配检查;
(4)正则表达匹配检查;如~^.*\.xiangx\.com$
(5)default_server;
4.root path;
设置资源路径映射:用于指明请求的URL所对应的资源所在的文件系统上的起始路径;
5.location
location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
功能:允许根据用户请求的URL来匹配定义的各location,匹配到时,此请求将被响应的location配置块中的匹配处理;
例如做访问控制等功能
= :精确匹配检查
~ :正则表达式模式匹配检查,区分字符大小写;
~* :正则表达式模式匹配检查,不区分字符大小写;
^~ :URI前半部分匹配,不检查正则表达式;
匹配的优先级:= –> ^~ –> ~ –> ~* –> 不带任何符号的location
sever {
listen 80;
server_name www.xiangx.com;
location / {
root “/web/www”;
}
location /images/ {
root “/web/images/”;
}
location ~*\.php$ {
fcgipass
}
}
6.alias path;
用于location匹配段,定义路径别名
location /images/ {
root “/vhost/web/”;
}
http://www.xiangx.com/images/a.jpg <– /vhost/web/images/a.jpg
location /images/ {
alias “/www/pictures”;
}
http://www.xiangx.com/images/a.jpg <– /www/picture/a.jpg
注意:root表示指明路径为对应的location “/” URL
alias表示路径映射,即location指令后定义的URL是相对于alias所指明的路径而言;
7.index file;
设置默认主页面:
index index.php index.html;
8.error_page code […] [=code] URI @name
根据http响应状态码来指明特定的错误页面;
error_page 404 /404_customed.html;
=code:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码;
server {
listen 8080;
server_name www.xiangx.com;
location / {
root “/web/www”;
error_page 404 /404.html;
}
}
9.基于IP的访问控制机制
allow IP/NETWORK
deny IP/NETWORK
10.基于用户的访问的控制
basic,digest;
auth_basic “string” //说明认证原因
auth_basic_user_file //指定认证用户的文件列表
账号密码文件建议使用htpasswd来创建
server {
listen 8080;
server_name www.xiangx.com;
location / {
root “/web/www/html”;
auth_basic “xiangx auth”;
auth_basic_user_file /etc/nginx/users/.htpasswd;
}
}
指定认证的用户:
#htpasswd -c -m /etc/nginx/users/.htpasswd tom
11.Nginx的https实现
创建私有CA
#cd /etc/pki/CA
#(umask 077;openssl genrsa -out private/cakey.pem
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
#touch index.txt serial
#echo 01 > serial
#mkdir /etc/nginx/ssl
#cd /etc/nginx/ssl
#(umask 077;openssl genrsa -out nginx.key 1024
#openssl req -new -key nginx.key -out nginx.csr
#openssl req -new -key nginx.key -out nginx.csr
server {
listen 443 ssl;
server_name www.ting.com
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
root /web/www/html;
index index.html index.htm;
}
}
状态页面,仅能用于Location中
location /status {
stub_status on;
allow 192.168.100.0/24;
deny all;
}
测试访问:http://192.168.100.2:8080/status
显示结果:
Active connections: 4 //当前所有处于打开状态的连接数
server accepts handled requests
44 44 29 //已经接收进来的连接 处理的连接 已经处理过的请求数,在保持连接模式下,请求数量可能会多余连接数量
Reading: 0 Writing: 1 Waiting: 3
Reading:正处于接收请求状态的连接数
Writing:请求已经接收完成,正处于处理请求或发送响应过程的连接数
Waiting:保持连接模式,且处于活动连接数;
13 rewrite regex replacement flag;
如:rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
http://www.xiangx.com/images/a/b/c/1.jpg –> http:www.xiangx.com/imgs/a/b/c/1.jpg
flag
last:一旦rewrite规则重写完成后,不再被后面其它的rewrite规则进行处理,而是由Uer Agent重新对重写后的URL
再一次发送请求,并从头开始执行类似的过程;
break:一旦此rewrite规则重写完成后,不再被后面其它的rewrite规则进行处理,User Agent重新对重写后的URL重新发起请求,且不再会被当前location内的任何rewrite规则检查;
redirect:以302响应码,返回新的URL 即临时重定向
permanent:以301响应码,返回新的URL 即永久重定向
location / {
root “/web/www/html”;
rewrite ^/bbs/(.*)$ /forum/$1 break;
}
备注:准备forum文件 echo “forum teting” > /web/www/html/forum/index.html
测试访问:http://192.168.100.2:8080/bbs/
14 if
语法: if (condition) {…}
上下文:server location
condition:
1.变量名:变量值为空串,或者以“0”开始,则为false,其它均为true;
2.以变量为操作数均构成比较表达式,可使用= !=类似的比较操作符进行测试
3.正则表达式模式匹配操作
~:区分大小写的模式匹配检查
~*:不区分大小写的模式匹配检查
!~ 和 ~!*:对上面的两种测试取反
4.测试路径为文件存在性: -f !-f
5.测试指定路径为目录的可能性:-d !-d
6.测试文件的存在性:-e !-e
7.检查文件是否有执行权限:-x !-x
如:
if ($http_user_agent ~* MSIE) {
rewrite ^(.*) /msie/$1 break;
}
15.防止盗链
location ~* \.(jpg|gif|png|jpeg)$ {
valid_referer none blocked www.xiangx.ocm; //定义合法引用
if ($invalid_referer) {
rewrite ^/ http://www.xiangx.com/403.html;
}
}
16.定制访问日志格式
log_format
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;
注意:此处可用变量为nginx各模块内建变量;
17.网络连接相关的配置
1.keepalive_timeout #; //长连接的超时时长,默认为75s;
2.keepalive_requests #; //在一个长连接上所能够允许请求的最大资源数;
3.keepalive_disasble [msie6|safari|none]; //为指定类型的User Agent禁用长连接
4.tcp_nodelay on|off; //是否对长连接使用TCP_NODELAY选项;将每次请求的资源都单独发送,不进行多个小资源合并发送,减少延迟;
5.client_header_timeout #; //读取http请求报文首部的超时时长
6.client_body_timeout # //读取http请求报文body部分的超时时长;
7.send_timeout #; //发送响应报文的超时时长;
18.fastcgi的相关配置
LNMP:PHP启用fpm模型
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
原创文章,作者:xiangx,如若转载,请注明出处:http://www.178linux.com/74505