标签:nginx简述及源码编译
简单罗列基础命令,只分享我的想法!
一、Nginx简介
Nginx("engine x") 是一个高性能的 HTTP和“反向代理”服务器,也是一个 IMAP/POP3/SMTP 的代理服务器。是logor Sysoev这个俄罗斯人开发的,lgor将源代码以类BSD许可证的形式发布,所以是开源软件,Nginx因为它的稳定性、丰富的功能集和低系统资源消耗而闻名,国内的sina和酷六等网站均部署了Nginx。
二、和httpd的相对说明
Apache的httpd-2.4版本才正式支持event模型,有别于httpd-2.2版本httpd-2.4版本提供了FastCGI模块,实现以FastCGI模块连接PHP,并且httpd-2.4的新特性刚刚支持异步I/O,而上述httpd的特性在Nginx的设计之初已经被考虑和解决,所以,Nginx也解决了C10K的问题,所以Nginx很流行,但是httpd的特性,Nginx也不是全部支持,Nginx的配置很“随意”也很灵活,但是httpd和Nginx真是各有千秋。
三、Nginx深入说明
(1)、Nginx是模块化设计,有较好的扩展性。
Nginx的模块化设计有别于httpd的DSO,httpd的DSO(动态共享模块)可以在使用该模块功能的时候在/etc/httpd/conf/httpd.conf中临时装卸载,而Nginx是把模块编译进来,随着Nginx的启动而启动,不能实现动态的装卸载。
(2)、更高的可靠性和更低的内存消耗
Nginx是有一个主控进行产生多个子进程,每个子进程可以响应N个用户请求的Event事件驱动模型。一个子进程响应10000个并发也许只占用2.5MB左右的内存。
因为Nginx是根据调用epoll()这个基于SignalDriven I/O(事件驱动式I/O)所开发的Event事件模型。
事件驱动式I/O,主要原理是在“硬盘数据加载到内核内存空间”阶段,调用程序是非阻塞状态,也就是说,每一个用户请求的数据,Nginx的子进程(worker)都会丢给kernel,kernel马上响应worker,但不是最终的结果,当kernel需要把kernel内存中的worker需要的数据拷贝到worker的内存空间时,kernel会通过状态、某种通信机制或回调函数告知worker准备好,我要把数据拷给你,从内核内存复制数据到worker的内存中,worker只能被阻塞,这就是Event模型,这也就是为什么可以同一个进程相应多个用户请求的原因。
当然了,现在的httpd-2.4版本和Nginx都支持异步模型,响应速度较Event模型也有很大的提高,因为从内核内存复制到worker内存的时候,worker也不会被挂起(也就是阻塞),等到全部数据已经拷贝到worker的内存时,通知worker直接打包封装发送给用户。
(3)、支持热部署:可以不停机更新配置文件、日志文件滚动、甚至升级程序版本。
最明显的体验是,当你配置Nginx要发布一个server的时候,只需reload即可,而不用像在httpd那样需要重新启动httpd进程。
(4)、充当静态资源WEB服务器的时候,能够缓存打开文件的描述符。
这个特性可以提高用户的响应速率,相当于拥有更多的缓存。
(5)、充当HTTP、POP3和SMTP的反向代理服务器。
反向代理服务器就是可以接收用户的请求,然后二次打包发给后面的其它服务器,这样的好处是可以把后面的服务器进行隔离,因为能够缓存打开文件的描述符,所以,也可以提高速度。
(6)、负载均衡
因为Nginx可以支持更多的并发请求,所以可以把这些请求按照某种算法分配到后面的不能接受大量并发请求的如PHP等服务器上面,这样可以更好的响应用户的请求。
(7)、支持FastCGI模块
(8)、支持SSL
以上是Nginx的主要的特性或功能,其实Nginx非常的灵活,所以,更多的时候需要你去官网查看某些配置命令的使用说明,官网的地址是:http://nginx.org/en/docs/
四、编译安装Nginx
(1)、其实在编译的时候最主要的是要把需要的模块编译进来,其它诸如worker进程的属主和属组,log文件的位置都可以在编译之后的配置文件中再定义,以下是较详细的编译,在编译前安装pcre-devel这个子包,用于支持url重写时候的正则表达式。
yum install pcre-devel –y
(2)、创建worker的属主和属组。
usr –r nginx
(3)、解压缩安装包,并编译
//--http-client-body-temp-path 用户上传的数据临时存放的目录 //--http-proxy-temp-path 作为代理服务器的时候,也需要从服务器取得内容,然后存放到本地的临时目录 //--http-uwsgi-temp-path 都是反向代理的缓存 //--http-fastcgi-temp-path 都是反向代理的缓存 //--with-http_stub_status_module 状态页面,相当于server-status ./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
(4)、编译和安装。
make && make install
(5)、创建相应的目录,否则Nginx不能启动。
mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi}
五、/etc/nginx/nginx.conf配置文件说明。
对配置文件的一些主要的配置命令做说明。
(1)、worker_rlimit_nofile #;主要是放在main上下文中,设定所有worker进程所能打开的句柄数,因为每个并发请求都是基于socket,linux一切皆文件,所以每个连接都会有一个socket文件,而linux限制是每个用户(Nginx)打开1024个文件,所以这里需要修改。
(2)、worker_processes #;worker进程的个数,需要小于cpu的核心数(默认是1)。
(3)、worker_cpu_affinity CPUMASK…; 主要是放在main上下文中,意义是把worker进程绑定到一个或多个cpu上面,以提高cpu二级cache的缓存命中率,阻止其它硬件或软件中断,以及减少一小部分CS(进程间切换)。
(4)、timer_resolution #;主要是放在main上下文中,应把#(100ms官方给的example)尽量的调小,让其尽量少的调用gettimeofday()函数获取时间。
(5)、worker_priority #;主要是放在main上下文中,可以设置为负数,因为主进程是以root的身份启动的,#数值越小,越优先(默认是0)。
(6)、accept_mutex on|off;主要是放在events上下文中,如果是on(默认)表示能让多个worker轮流地、序列化地去响应新的请求,而off是随机的选取worker相应。
(7)、worker_connections #;主要是放在events上下文中,一个worker进程所处理的最大并发连接数。
(8)、daemon on|off;主要是放在main上下文中,如果在编译的时候添加—with-debug,才能编辑此命令,是否以守护进程的模式来运行Nginx,一般在调试的时候选择off(on默认),能够查看问题。
(9)、master_process on|off;主要是放在events上下文中,是否以master/worker模型来运行Nginx,调试的时候关闭(默认是on)。
注意:以上所用到的均是Nginx的core module,在官方网站中均可以查看。网站地址如下:http://nginx.org/en/docs/ngx_core_module.html
六、WEB服务配置框架说明。
配置WEB服务器在配置命令中的大致框架为:
http { upstream { //主要是需要配置负载均衡的时候使用 … } server { location URL { … } If (CONDITION) { … } }//类似httpd中的<Location>定义URL的。
七、WEB服务配置选项主要说明。
定义一个WEB虚拟机
server { listen 8080; server_name www.wlw.com; location / { root"/vhost/web/"; #auth_basic " renzheng "; #auth_basic_user_file/etc/nginx/renzheng/.htpasswd; error_page 404 /404_customed.html; rewrite^/.*\.text$ /index.html break; } location /host/ { alias /hosts/; } location /err/ { root "/vhosts/web/"; } }
想通过此虚拟机说明以下几个问题。
(1)、root PATH;其实你可以把它理解为对/目录的一个alias,也就是说上文的第三个location,如果你去访问www.wlw.com:8080/err/其实相当于访问www.wlw.com:8080/vhosts/web/err/。
(2)、server_name NAME;如果有多个虚拟机,是这样查找FQDN的。
先做精确匹配检查;
左侧通配符匹配检查:*.magedu.com
右侧通配符匹配检查:如mail.*
正则表达式匹配检查:如~^.*\.magedu\.com$
default_server;
(3)、基于IP的访问控制。
在location或server中,通过以下命令实现。
allow IP/MASK|all deny IP/MASK|all
(4)、基于用户的访问控制
#auth_basic " ren zheng "; #auth_basic_user_file /etc/nginx/renzheng/.htpasswd;
这个在事例中已经演示(测试的时候麻烦,禁用了),其实和httpd差不多,只不过httpd的AuthType basic省略,而AuthName被auth_basic替换,AuthUserFile被auth_basic_user_file取代,同样是通过htpasswd这个命令生成密码。
(5)、命令别名
上述的示例中已经明确了命令别名的用法,和httpd中的配置一样。
(6)、location的用法如下:
location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... }
功能:允许根据用户请求的URI来匹配定义各location;匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能;
=:精确匹配检查;
~: 正则表达式模式匹配检查,区分字符大小写;
~*: 正则表达式模块匹配检查,不区分字符大小写;
^~:URI的前半部分匹配,不支持正则表达式;
匹配的优先级:精确匹配(=)、^~、~、~*、不带任何符号的location;
注意:用到了正则表达式都会消耗一定的cpu周期。
(7)、URL rewrite
rewrite regex replacement flag;
flag:
last:一旦此rewrite规则重写完成后,就不再被后面其它的rewrite规则进行处理;而是由User Agent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程。
break:一旦此rewrite规则重写完成后,由User Agent对新的URL重新发起请求,且不再会被当前location内的任何rewrite规则所检查。
redirect:以302响应码(临时重定向)返回新的URL。
permanent:以301响应码(永久重定向)返回新的URL。
注意:事例使用的flag为break,把所有以.text结尾的请求重写到index.html,如下图所示。
图1
把以上事例的flag修改成永久重定向permanent,显示如下图2。
图2
注意:同样的请求,一个重写一个永久重定向,图1仍然是www.wlw.com:8080/xxx.text,而永久重定向就是www.wlw.com:8080/index.html。
(8)、根据httpd的响应状态码来指明特定的错误页面
error_page code ... [=[response]] uri;定义在location或者server中都可以但是必须是/下,根据上面的事例,进行测试,截图如下。
图3
(9)、https服务
和httpd的配置一样,只要在/etc/nginx/nginx.conf中修改以下配置即可。
# HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
(10)、显示类似server-status的页面。
location /server-status { stub_statuson; allow172.16.29.1; }
显示截图如下。
图4
代表的意义:仅有一个客户端连接进来(我用的是我的物理机打开),已经接受的连接数31次,已经处理过的连接数也是31次,已经处理了66次请求。正处于请求状态的连接数是0,请求已经接收完成,正处于处理请求或者发送响应过程的连接数是1,保持连接模式且处于活动状态的连接数是0。
(11)、防盗链
location ~* \.(jpg|gif|jpeg|png)$ { valid_referernone blocked www.wlw.com; if($invalid_referer) { rewrite^/ http://www.wlw/403.html; } }
(12)、keepalive_timeout #;
在http,server及location的上下文中配置,长连接的超时时长,默认75s;
(13)、keepalive_requests #;
在http,server及location的上下文中配置,在一个长连接上所能够允许请求的最大资源数,默认是100个请求
(14)、keepalive_disable [msie6|safari|none];
为指定类型的UserAgent(浏览器)禁用长连接;
(15)、tcp_nodelay on|off;
意义是合并多个小的请求,然后统一在发送,如果要提高用户的体验,这项必须on。
(16)、client_header_timeout #;
读取http请求报文首部的超时时长。
(17)、client_body_timeout #;
读取http请求报文body部分的超时时长。
(18)、send_timeout #;
发送响应报文的超时时长。
注意:以上所有的配置命令,都是根据Standard HTTP Modules和Optinos HTTP Modules,这连个模块集的说明来定义的,网址http://wiki.nginx.org/Modules,可以在配置的时候查看。
(19)、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; }
以上是对Nginx的简单认识。
本文出自 “只写感受!” 博客,请务必保留此出处http://damihua.blog.51cto.com/6537272/1654537
标签:nginx简述及源码编译
原文地址:http://damihua.blog.51cto.com/6537272/1654537