[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
## 安裝
## 目錄結構 & 配置文件