雖然Apache是整個www服務中中堅力量,但是他也不是萬能的,他也有他的不足。那就是他的 “抗壓”能力相比之下有些不足,當面臨數萬的訪問量的時候,Apacheserver 能做的只有“吃cpu,耗內存”, 而俄羅斯開發的Nginx也是一款不錯的HTTPServer的服務軟件。市場的佔有率也不容忽視。
最新數據可以看出,Apache狀態不佳,而微軟和Nginx略有上升的趨勢
數據來自http://news.netcraft.com
作爲一個技術人員,特別是互聯網方面,給自己注入“新鮮的血液”已經是我們的準則之一。
來說說 Apache和Nginx的區別吧 ,也便於我們的學習。
① 首先Apache是支持併發連接的,運行httpd這個服務後,就會產生很多的子進程/線程來響應不同的客戶端請求。Apache兩種工作模式:是prefork模式與worker模式
prefork每個子進程只有一個線程,效率高但消耗內存大,是linux下默認的模式;worker模式每個子進程有多個線程,內存消耗低,但一個線程崩潰會牽連其它同子進程的線程。
② 另外Apache支持靜態網頁和動態網頁,比如他的PHP就是靠自己所支持的模塊來實現的mod_php5 又被稱爲apxs2。
③ 因此Apache是基於多進程的這樣一個HTTPServer,也正是他這樣的特點,註定了Apache在接受大的併發量的時候,無意會佔用大量的cpu和內存資源,而這些並不是我們願意看的。
而Nginx並不是基於進程的HTTPServer,是一種異步服務器,“異步”一詞我也沒有很深的瞭解,只知道他能利用極少的硬件資源去響應大量的客戶請求,達到以一當百的效果。比如,對於10,000的併發連接請求,nginx可能僅僅使用幾M的內存;而Apache可能需要使用幾百M的內存資源。
nginx和Apache類似都通過各種模塊可以對服務器的功能進行豐富的擴展,同樣都是通過conf配置文件對各種選項進行配置。但是,Nginx雖好,對於PHP等動態網頁,nginx沒有內置的模塊來對PHP進行支持,而是通過FastCGI來支持的。(以上內容參考教學資料)
下面我們就來搭建Nginx
安裝Nginx和安裝Apache的區別並不是很大,這裏我分爲三個步驟
1.獲取軟件包: 其安裝文件可以從官方網站http://www.nginx.org下載,並且Nginx的windows版本有,很方便。
2.安裝Nginx所需要的依賴包,以及運行的賬戶和組。
3.編譯安裝,並優化路徑
Yum安裝所需要的安裝包
yum -y install pcre-devel zlib-devel
創建用戶和組 不指定宿主目錄 不允許登陸系統
編譯安裝
--with-http_stub_start_module: 指定啓用http_stub_start_module這個模塊來支持狀態統計
更多的參數可以用 ./configure --help 查看
make && make install 來編譯安裝
安裝完成後 優化路徑
使用nginx -t 命令查看配置文件是否有錯誤
Nginx安裝完畢
使用命令 nginx啓動服務 使用kill 或者 killall 關閉服務
使用kill ,nginx 命令管理服務不是很方便,也不服務linux的風格,所以在這我就手動編寫nginx的系統服務腳本,並且添加到系統服務中
腳本如下:
———————————————————————————————————————
#!/bin/bash
# chkconfig: - 60 50
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
nginx_path="/usr/local/nginx"
nginx_pid="/usr/local/nginx/nginx.pid"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginx_path/sbin/nginx ] || exit 0
RETVAL=0
prog="nginx"
start() {
# Start daemons.
if [ -e $nginx_pid -a ! -z $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
if [ -e /usr/local/nginx/conf/nginx.conf ];then
echo -n $"Starting $prog: "
$nginx_path/sbin/nginx -c /usr/local/nginx/conf/nginx.conf &
RETVAL=$?
[ $RETVAL -eq 0 ] && {
touch /var/lock/subsys/$prog
success $"$prog"
}
echo
else
RETVAL=1
fi
return $RETVAL
}
# Stop daemons.
stop() {
echo -n $"Stopping $prog: "
killproc -d 10 $nigx_path/sbin/nginx
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f $nginx_pid /var/lock/subsys/$prog
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit $RETVAL
———————————————————————————————————————
這個腳本只能做到部分的功能,沒有完善。
給予權限並添加到系統服務
驗證腳本
啓動後能夠訪問Nginx的主頁面 應注意防火牆的配置
Nginx的主配置文件 nginx.conf
Nginx的主配置文件主要有三部分組成
——全局配置
——I/O事件配置
——HTTP配置
文件中 # 號表示註釋內容 ; 表示結束。
1)全局配置
由各種配置語句組成,不使用特定的界定標記。全局配置部分包括運行用戶、工作進程數、錯誤日誌、PID存放位置等基本設置。
常用配置項:
user nobody;
//運行用戶,Nginx的運行用戶實際是編譯時指定的nginx,若編譯時未指定則默認爲nobody
worker_processes 2;
//指定nginx啓動的工作進程數量,建議按照cpu數目來指定,一般爲它的倍數
worker_cpu_affinity 00000001 00000010;
//爲每個進程分配cpu,上例中將2個進程分配到兩個cpu,當然可以寫多個,或者將一個
進程分配到多個cpu
worker_rlimit_nofile 102400;
//這個指令是指當一個nginx進程打開的最多文件數目,理論值應該是最多打開文件數(ulimit
-n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值
保持一致。(通過”ulimit –n 數值”可以修改打開的最多文件數目)
error_log logs/error.log; //全局錯誤日誌文件的位置
pid logs/nginx.pid; //PID文件的位置
2)I/O事件配置:
使用”events {}”界定標記,用來指定Nginx進程的I/O響應模型,每個進程的連接數等設置
events {
use epool; //使用epool模型,對於2.6以上的內核,建議使用epool模型以提高性能
worker_connections 4096; //每個進程允許的最多連接數(默認爲1024),每個進程的連接數應根據實際需要來定,一般在10000以下,理論上每臺nginx服務器的最大連接數爲worker_processes*worker_connections,具體還要看服務器的硬件、帶寬等。
}
3)HTTP配置
使用”http{}”界定標記,包括訪問日誌、HTTP端口、網頁目錄、默認字符集、連接保持、以
及虛擬主機、PHP解析等一系列設置。其中大部分配置語句包含在子界定標記”servier {}”內。
http { #設定mime類型,即conf/目錄下的mime.types文件中的設定。 include mime.types; default_type application/octet-stream; #設定日誌格式 log_format main '$remote_addr - $remote_user [$time_local]' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; log_format download '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_range" "$sent_http_content_range"'; #設定access log access_log logs/access.log main; sendfile on; //支持文件發送(下載) keepalive_timeout 65; //連接保持超時 #設定虛擬主機 server { //用來配置虛擬主機 listen 80; //WEB服務的監聽設置,可以採用”IP地址:端口”形式 server_name www.lnmp.com;//網站名,稱可以寫多個名稱,用空格分隔
location / { //表示如何匹配後面的路徑的
index index.html; //默認首頁
root html; //網頁根目錄位置,默認爲Nginx安裝目錄下的html/子目錄,root語句用來設置特定訪問位置的網頁文檔路徑,根據需要可改爲/var/www/html等其他路徑。
} charset gb2312; //網頁的默認字符集 #設定本虛擬主機的訪問日誌 access_log logs/www.lnmp.com.access.log main;
error_page 500 502 503 504 /50x.html; //內部錯誤的反饋頁面
location = /50x.html {
root html;
} }}
Nginx的location 配置:
基本語法: location [=|~|~*|^~] /uri/ { … }
= 表示做精確匹配~ :爲區分大小寫匹配~*: 爲不區分大小寫匹配!~ :和 !~* 分別爲區分大小寫不匹配及不區分大小寫不匹配
正則表達式匹配,其中:文件及目錄匹配,其中:-f 和 !-f 用來判斷是否存在文件-d 和 !-d 用來判斷是否存在目錄-e 和 !-e 用來判斷是否存在文件或目錄-x 和 !-x 用來判斷文件是否可執行
示例1:
location = / {# 只匹配 / 查詢。}
location / {
#匹配任何查詢,因爲所有請求都已 / 開頭。但是正則表達式規則和長的塊規則將被優先和查詢匹配
}
示例2:
location ^~ /images/ {# 匹配任何以 /images/ 開頭的任何查詢並且停止搜索。任何正則表達式將不會被測試。}
示例3:
location ~* \.(gif|jpg|jpeg)$ {# 匹配任何以 gif、jpg 或 jpeg 結尾的請求。}
Nginx的狀態統計:
Nginx內置了HTTP_STUB_STATUS狀態統計模塊,用來反饋當前的WEB訪問情況。配置
編譯參數時可添加—with-http_stub_stastus_module來啓用此模塊。要使用Nginx的狀態統計功能,除了啓用內建模塊以外,還需要修改nginx.conf文件,指定訪問位置並打開stub_status配置。在http{}配置的server{}子配置內添加如下配置項
注:location /status //匹配任何包含/tongji的任何查詢
stub_status on //打開狀態統計功能
Access_log off //關閉此位置的日誌記錄
Nginx 支持爲目錄添加密碼認證,使用apache 的 htpasswd 來創建密碼文件
htpasswd -c /.htpass 用戶名
保存修改過的nginx.conf文件並重啓nginx服務使修生效。
新的配置生效後,在瀏覽器中訪問Nginx服務器的/tongji網站位置(http://web服務器
IP/status)可以看到狀態統計信息
驗證
active connections — 發起的活動連接數 1個
server accepts handled requests — nginx 總共處理了 4個連接, 成功創建4次握手 (證明中間沒有失敗的), 總共處理了 6 個請求
Nginx的訪問控制:
allow 允許規則,deny拒絕規則;
規則的執行是按從上向下執行,匹配某條規則後將不再檢查其他規則。
拒絕後顯示 被禁止
Nginx的虛擬主機配置:
虛擬主機的概念不用過多的解釋,Apache部分已經做過介紹。就直接做配置了。
使用Nginx搭建虛擬主機服務器時,每個虛擬WEB站點擁有獨立的”server {}”配置段,各自監聽的IP地址、端口號可以單獨指定,當然網站名稱也是不同的。
現在我就創建兩個虛擬主機 www.51cto.com 和 www.nginx.org
先創建網頁文檔目錄和引導文件
然後修改nginx.conf文件 天驕 server{} 字段 並在其中指定網站名稱 監聽地址等信息
注意全局配置中的log設置
重啓服務 注意dns的配置
最終結果
51
Nginx
其他兩種方式 照葫蘆畫瓢 參考Apache的配置。
End