[TOC] # WEB介绍 WEB(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。当前可以提供支持WEB的软件,常用的有Nginx、Apache、Tomcat和Weblogic。本章节主要介绍Nginx和Apache。 # Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理WEB服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 ## Nginx 服务器的Web请求处理机制 * 多进程方式 * 多线程方式 * 异步方式 ## Nginx服务器的事件驱动模型 * select库 * poll库 * epoll库 **Select库** Select库,目前Linux和Windows平台都支持基本事件驱动模型,并且在接口的定义上也大致相同,只是部分参数含义略有差异。Select库的工作原理: * 首先,创建所关注事件的文件描述符,对于一个描述符可以关注上面的读事件、写事件和异常发生事件,所以要创建三类文件描述符的集合,分别用来收集读事件描述符、写事件描述符和异常事件的描述符。 * 其次,调用底层提供的select() 函数,等事件发生。这里需要关注的一点是,select的阻塞是否设置非阻塞I/O是没有关系的。 * 最后,轮训所有事件描述符集合中的每一个事件描述符,检查是否有响应事件的发生,如果有就处理。 **Poll库** poll库,作为Linux平台上的基本事件驱动模型,在Linux2.1.23中引入。目前Windows平台尚未支持poll库。poll库与select的工作方式基本是相同的,都会创建一个关注事件的描述符,再去等这些事件的发生,然后再轮训描述符的集合,检查是否有发生变化,如果有变化就去处理。 poll库与select库的区别,select库需要为读事件、写事件和异常事件分别创建一个描述符集合,因此在最后轮询的时候,需要分别轮询三个集合,在大量访问的时候有性能的消耗。而poll只需要创建一个集合,描述符对应结构上分别设置读事件、写事件或者异常事件,最后轮询的时候可以同时检测这三个事件是否有发生。可以说poll库是select库的优化实现 **Epoll库** Epoll库是Nginx服务器支持的高性能驱动库之一。Epoll是poll库的一个变种是在Linux2.5.44中引入,在Linux2.6及以上版本可以使用它。从前面的介绍我们知道,它们的处理方式都是创建一个待处理事件列表,然后把这个列表发给内核,返回的时候,再去轮询检查这个列表,以判断事件是否发生。这样在描述符比较多的应用中,效率就显得比较低下了。一种比较好的做法是、把描述符列表的管理交由内核负责,一旦有某种事件发生,内核把发生事件的描述符列表通知给进程,这样就避免了轮询整个描述符列表。epoll库就是这样一种模型。 * 首先,epoll库通过相关调用通知内核创建一个有N个描述符的事件列表;然后给这些描述符设置所关注的事件,并把它添加到内核的事件列表中去,在具体的编码过程中也可以通过相关调用对事件列表中的描述符进行修改和删除。 * 完成设置之后,epoll库就开始等待内核通知事件发生了。某一事件发生后,内核将发生事件的描术符列表上报给epoll库。得到事件列表的epoll库,就可以进行事件处理了。 epoll库在Linux平台上是高效的。它支持一个进程打开大数目的事件描述符,上限是系统可以打文件的最大数目。同时epoll库的IO效率不随描述符数目增加而线性下降,因为它只会对内核卜的“活跃”的描述符进行操作。 ## 安装 我们首先来安装Nginx这个软件。 ``` [djangowang@localhost ~]# yum install nginx ``` ## 目录结构 & 配置文件 **目录结构** **配置文件** 配置文件存放在/etc/nginx/nginx.conf,配置文件的内容如下。 ``` user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80; server_name blog.puppeter.com; root /data/webroot/blog/; index index.php index.html index.htm; location ~ \.php$ { include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; } } } ``` ## 虚拟主机(vhost) ``` <VirtualHost *:80> ServerAdmin webmaster@dummy-host.localhost DocumentRoot "/data1/webroot/fastadmin.puppeter.com/" ServerName fastadmin.puppeter.com ServerAlias localhost ErrorLog "/data1/webroot/logs/fastadmin.puppeter.com/log/fastadmin.puppeter.com-error.log" CustomLog "/data1/webroot/logs/fastadmin.puppeter.com/log/fastadmin.puppeter.com-access.log" common <Directory "/data1/webroot/fastadmin.puppeter.com/"> Options Indexes MultiViews AllowOverride All # OSX 10.10 / Apache 2.4 Require all granted </Directory> </VirtualHost> ``` # Apache ## 安装 ## 目录结构 & 配置文件