nginx是当前流行的用作反向代理服务器,作为web服务器,某些地方甚至优于apache
特性:
1.基于边缘触发的epoll提供IO多路复用,epoll基于事件驱动的IO模型,提高了响应连接请求的性能
2.目前不支持模块的动态装卸载,模块只会随着程序的启动而启动,但是由阿里做二次改进的版本 tengine支持
3.高可靠:一个主控进程master创建工作子进程worker,主控进程读取验证配置,创建绑定套接 字,启动终止维护woker进程的个数,无需重启进程让新配置加载,平滑版本升级。worker子进程 可以负责缓存加载,响应用户请求,管理缓存等
4.低内存消耗
5.支持热部署,支持不停机更新配置文件或更换日志文件,升级程序版本
6.事件驱动,异步IO,内存映射(mmap),sendfile和sendfile64(可以发送更大的文件)
sendfile机制:没有sendfile机制的话:客户请求---->内核加载磁盘数据到内核内存--->从内核内 存复制到进程内存 --->从进程内存返回到内核内存---->通过网卡回应客户请求,有了sendfile 请求---->内核加载磁盘数据到内核内存---->通过网卡响应给客户,省去了中间的多余步骤
基本功能:
1.静态资源的web服务器,能缓存打开的文件描述符,实现打开同一个文件多次时,打开性能提升
2.支持http,smtp,pop3三种协议的反向代理服务器,反向代理服务器放置于客户和web服务器之 间,利用缓存加速响应客户端,能处理用户请求从而减缓web服务器压力,加强web服务器安全
3.缓存加速,负载均衡
4.支持fastcgi协议(实现LNMP),uwsgi(实现与python交互)
5.非DSO机制的模块化,过滤机制(对某些内容特殊处理,如压缩),ssi(服务器端包含)图像大 小调整
6.支持SSL,提供https服务
扩展功能:
1.基于ip和名称的虚拟主机
2.支持长连接---keepalive
3.平滑升级
4.定制访问日志,支持日志缓存区提高日志存储性能
5.url重写
6.路径别名
7.基于ip和用户的访问控制,用户访问控制需要借助httpd提供的htpasswd
8.支持速率限制,并发访问数量限制
工作模式:非阻塞,事件驱动,一个主进程生成多个woker子进程,每个woker可以响应多个请求
模块类型:
核心模块
标准http模块
可选的http模块
邮件相关模块
第三方模块
编译安装nginx:
1、解决依赖关系
编译安装nginx需要事先需要安装开发包组"Development Tools"和 "Development Libraries"。同时,还需要专门安装pcre-devel包:
# yum -y install pcre-devel(基于perl的正则表达式以支持url重写匹配)
2、安装
首先添加用户nginx,实现以之运行nginx服务进程:
# groupadd -r nginx
# useradd -r -g nginx nginx
接着开始编译和安装:
# ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--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 \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_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/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre
# make && make install
创建上面指定的没有的路径:
mkdir -pv /var/tmp/nginx/{client,fastcgi,proxy,uwsgi}
启动nginx:
/usr/local/nginx/sbin/nginx
配置文件/etc/nginx/nginx.conf
配置文件的http://nginx.org/en/docs/ngx_core_module.html 官方文档说明
main配置段:全局配置
http{}配置段:http协议相关配置
event{}配置段:定义event模型工作特性
主配置段指令:
1.正常运行的必备配置:
user nginx nginx 指以nginx用户和nginx组运行nginx程序
pid /var/run/nginx/nginx.pid 指定nginx守护进程的pid文件位置
woker_rlimit_nofile:指定所有woker进程能够打开的最大文件句柄数
2.性能优化相关的配置:
woker_processes #:woker进程的个数,通常少于cpu物理核心数
worker_cpu_affinity
:将某woker进程绑定到某特定CPU,如果woker进程经常在各个cpu上切换,另外,对于此nginx的进程的缓存不会失效,这里用到了cpumask,0000 0001代表第一颗cpu,0000 0010代表第二颗,00000100代表第三颗,第几颗对应的就是第几位
timer_resolution
:计时器解析度,降低可减少gettimeofday()调度,从而
提高性能
worker_priority
:worker进程优先级,这里使用nice值指明,越小优先级越高
accept_mutex
:master调度各woker进程时使用的负载均衡锁,on表示能让多个进程轮流序列化地响应请求
lock_file
:锁文件路径
use:使用何种事件驱动模型(select,epoll等)
worker_processes
:设定单个woker进程所能处理的最大并发连接数
worker_connections:一个woker进程能处理的并发连接数
3.调试和定位问题相关配置:
只有在编译nginx时打开--with-debug才能指定debug级别,否则就算指定debug级别也无效
root@localhost nginx-1.8.0]# ./configure --help | grep debug
--with-debug enable debug logging
daemon
:是否以守护进程运行nginx,off表示运行在前台,这样可以输出调试信息
master_process
:调试时设置为off
error_log
:日志位置和级别指定
常需要调整的参数
worker_processes
worker_priority
worker_cpu_affinity
worker_connections
使用nginx -s reload可以重载nginx
4.nginx作为web服务的配置:由ngx_http_core_module提供
官方文档http://nginx.org/en/docs/http/ngx_http_core_module.html
1.server{
location URL{
root 指明location的url是本地文件系统哪个路径
} #location用于定义url和本地文件系统的映射关系
}#每个server类似于httpd中的<VirtualHost>,一个server中可以有多个location
与http相关的指令只能放置于http,server,location,upstream中,但有些指令只能应用于这五种中的某几种
定义一个基于端口的虚拟主机:
2.listen
listen ip:[port];
listen port;
3.server_name 后面可以跟多个主机名,名称还可以使用正则表达式(~)或者通配符匹配
匹配优先级从高到低规则:
(1)先做精确匹配检查
(2)左侧通配符匹配检查 *.lee.com
(3)右侧通配符匹配检查 mail.*
(5)default_server 以上都匹配不到则匹配此默认法则
4.location根据用户请求的url匹配定义的各location,匹配到时,此请求被相应的location块处理,例如做访问控制等
location [
=
| ~
|~*
| ^~
] uri
{ ... }location
@
name
{ ... }
=表示精确匹配检查
~正则表达式模式匹配检查,区分字符大小写
~*
正则表达式模式匹配检查,不区分字符大小写
^~uri的前半部分匹配,且不检查正则表达式
不带等于号的相当于起始于这个路径的都可以被匹配
匹配优先级 第一是 = 第二是 ^~ 第三是 ~ 第四是 ~* 最后是不带任何符号的
官方范例:
location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] }
The “/
” request will match configuration A,
the “/index.html
” request will match configuration B,
the “/documents/document.html
” request will match
configuration C,
the “/images/1.gif
” request will match configuration D, and
the “/documents/1.jpg
” request will match configuration E.
The “@
” prefix defines a named location.
Such a location is not used for a regular request processing, but instead
used for request redirection.
They cannot be nested, and cannot contain nested locations
实验测试:
根据优先级这个匹配到了第三个location,而第三个location的root其实是指向的根,下面没有image目录,所以报错
5.alias 用于location配置段,定义别名
location /images/ {
root "/vhosts/web1";
}
http://www.lee.com/image/a.jpg<-------/vhosts/web1/images/a.jpg
location /images/ {
alias "/www/pictures/";
}
http://www.lee.com/image/a.jpg<-------/www/pictures/a.jpg
本文出自 “明天过后” 博客,请务必保留此出处http://leeyan.blog.51cto.com/8379003/1701381
原文:http://leeyan.blog.51cto.com/8379003/1701381