一、Nginx 優點
-
高性能web,可以支持反向代理
-
比Apache性能優越,支持更多的并發連接,但資源占用很少,輕量級的web服務器??梢灾С指哌_50000個并發連接數的響應
-
Nginx 在Linux 2.6+ 使用epoll模型,提供卓越性能
-
做為負載均衡服務器,可以在內部直接支持PHP和Rails,也可以支持作為HTTP代理服務器對外進行服務
-
Nginx使用C編寫,不能是系統資源開銷還是CPU使用效率都比Perbal要好
-
支持郵件代理服務器,也是一款非常優秀的郵件代理服務器,Nginx早期其實是一個郵件代理服務器
-
Nginx安裝簡單,配置文件簡潔,還支持perl語言,bug很少,穩定性很好,幾乎可以支持7&24小時不間斷運行,還可以在實現在不間斷提供服務情況實現平滑升級
-
在線幫助文檔很豐富
二、軟件獲得及幫助文檔
官方網址:http://nginx.org/
下載穩定版本:http://nginx.org/download/nginx-1.8.0.tar.gz
幫助文檔:http://nginx.org/en/docs/
編譯參數說明:http://nginx.org/en/docs/configure.html
三、軟件安裝
1、 ./configure –help 編譯參數中文說明,可能不是很準確,敬請指正。
-
–with-rtsig_module。在Linux 2.2.19 內核默認情況下,實時信號連接不超過1024.使用rtsig模塊可以突破這個限制。需要修改內核參數/proc/sys/kernel/rtsig-max,才能達到效果。centos 6.6沒有這個內核參數,應該是不支持這個參數了。網上說Linux 2.6.6-mm2開始不再支持這個參數。centos 6.7的內核:2.6.32-504。這個參數在Linux2.6內核基本上不用了
-
–with-select_module select模式的性能同poll模塊的性能相當。Linux內核2.6+的可以選擇epoll模塊
-
–with-threads 配置線程池。
-
–with-file-aio 開啟通過異步I/0(允許進程發起很多I/O操作,而不用阻塞或等待任何操作完成)的方式讀取文件
-
異步I/O:針對網絡I/O 使用epoll模型,針對文件(設備)的I/O使用AI0
-
AIO的基本思想:允許進程發起很多I/O操作,而不用阻塞或等待任何操作完成,稍后或在接收到I/O操作完成通知時,進程可以檢索I/O操作結果。在異步非阻塞I/O中,我們可以同時發起多個傳輸操作,這需要每個傳輸操作都有唯一的上下文,這樣我們才能在他們完成時區分到底是哪個傳輸操作完成了,這個工作可以通過aiocb結構體進行區分
-
–with-http_spdy_module spdy是Google開發的基于TCP的應用層協議,用以最小化網絡延遲,提升網絡速度,優化用戶的網絡使用體驗。SPDY并不是一種用于替代HTTP的協議,而是對HTTP協議的增強。新協議的功能包括數據流的多路復用、請求優先級以及HTTP報頭壓縮。谷歌表示,引入SPDY協議后,在實驗室測試中頁面加載速度比原先快64%。Linux的發行版提供的軟件源里一般情況是不帶這個功能,需要下載源碼編譯安裝
-
–with-http_ssl_module 支持ssl
-
–with-http_realip_module 此模塊支持顯示真實來源IP地址,主要用于NGINX做前端負載均衡服務器使用,或者反向代理
-
–with-http_addition_module 游戲服務器不必安裝,門戶網站可以安裝,有利于被搜索引擎收錄頁面信息。用于SEO:搜索引擎優化
-
–with-http_xslt_module 這個模塊是一個過濾器,它可以通過XSLT模板轉換XML應答。0.7.8后面版本才可以使用。
-
–with-http_image_filter_module 是nginx提供的集成圖片處理模塊,nginx-0.7.54以后的版本才可以使用。主要的功能:實時縮放圖片,旋轉圖片,驗證圖片有效性以及獲取圖片寬高以及圖片類型信息。適用于訪問不是太大,硬盤空間有限的情況下,高并發訪問量不適合開啟該模塊
-
–with-http_geoip_module Linux的發行版提供的軟件源一般情況是不帶這個功能,需要下載源碼編譯安裝。獲取客戶端的IP地址,在IP地址數據庫中查詢該IP來自哪個國家/城市 不一定準,只能做參考,很多時候IP數據庫里的數據不準確。
-
–with-http_sub_module 能夠在nginx的應答響應報文中搜索并替換某些文本
-
–with-http_dav_module 為文件和目錄指定權限,限制不同類型的用戶對于頁面有不同的操作權限
-
–with-http_auth_request_module 認證模塊
-
–with-http_gzip_static_module:提供對靜態文件預壓縮。例如:提供一個index.html的文件,在nginx訪問之前對文件進行壓縮成index.html.gz 這樣nginx訪問的時候大大節約帶寬和時間(不需要壓縮),nginx訪問的是index.html.gz這個文件??梢赃x擇壓縮比高的算法,雖說占CPU資源,但是不是在nginx訪問的時候進行壓縮,這樣并沒有太大的問題
-
–with-http_gzip_module:通過Linux發行版的軟件倉庫的方式安裝是提供的。這個是對文件進行壓縮,壓縮比一般超過50%
-
–with-http_random_index_module 選擇一個隨機的主頁
-
–with-http_secure_link_module 這個模塊用于為所需的安全性“令牌”計算和檢查請求URL。在0.7.18版本以上的Nginx中提供了該模塊。默認安裝不包括此模塊。對于0.8.50之后的版,有添加了secure_link_md5指令和secure_link_expires變量,因此,secure_link_secret已經不贊成使用了
-
–with-http_degradation_module 允許在內存不足的情況下返回204或444碼。204:無內容。444:無響應
-
–with-http_stub_status_module Nginx健康狀態檢測模塊,做反向代理服務器的時候對后端服務器的存活狀態進行檢測
-
ngx_http_geo_module 可以創建一個變量,變量的值依賴于客戶端的IP地址。默認是開啟的。如果不使用–without-ngx_http_geo_module
-
–with-http_charset_module:向響應報文頭部“Content-Type”字段添加指定的字符,可用于不同字符集之間的轉換(不同的編碼之間進行轉換)不過有局限性。例如:從服務器到客戶端,僅僅單字節的字符集能被進行轉換或者單字節字符集能被轉到utf8格式或者從utf8格式轉到單字節字符集
-
–with-http_userid_module: 對登錄的UID設置適當的cookies信息。相當于Apache的mod uid模塊
-
–without-http_map_module: map指令依賴于此模塊。創建變量依賴于其他的變量。允許分類或者同時映射多個值到多個不同值并儲存到一個變量中,map指令用來創建變量,但是僅在變量被接受的時候執行視圖映射操作,對于處理沒有引用變量的請求時,這個模塊并沒有性能上的缺失。
-
–with-http_referer_module:基于RefererHTTP請求頭對請求進行過濾.referer是 http的headers,告訴服務器此請求是從哪個頁面過來的
-
–with-http_proxy_module:http代理模塊,一般是反向代理
-
–with-http_empty_gif_module:異步統計使用1×1的空白圖片傳遞統計參數,提高性能,空圖片運行在內存中,比使用靜態文件傳遞參數效率要高
-
–with-http_upstream_hash_module: nginx工作于負載均衡模型中由upstream將請求調度到上游服務器。hash模塊執行hash運算的。
調度算法:
-
ip_hash(源地址hash,將來自同一IP的請求調度同一個Real Server??梢越鉀Qsession問題)、
-
最小連接數,可以基于權重
-
輪詢,可以基于權重
-
fair:第三方,按后端服務器的響應時間來分配請求,響應時間短的優先分配)
-
url_hash:第三方,按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,nginx為緩存服務器時比較有效
-
–with-http_upstream_keepalive_module:keepalive 常連接模塊
-
–with-http_perl_module:Perl模塊支持Perl腳本,比fast-cgi模型性能稍好
-
解決依賴關系:yum -y install perl perl-devel perl-ExtUtils-Embed
-
–with-ld-opt="-Wl,-E"。加入perl模塊,需要加上這項,否則會報錯
-
–with-http_split_clients_module 該模塊用來基于某些條件劃分用戶。條件如:ip地址、報頭、cookies等,禁用–without-http_split_clients_module
-
–without-http_browser_module 禁用ngx_http_browser_module支持(該模塊用來創建依賴于請求報頭的值。如果瀏覽器為modern ,則$modern_browser等于modern_browser_value指令分配的值;如 果瀏覽器為old,則$ancient_browser等于 ancient_browser_value指令分配的值;如果瀏覽器為 MSIE中的任意版本,則 $msie等于1)
2、安裝之前解決依賴關系。yum -y install pcre openssl-devel pcre-devel zlib-devel gcc
3、需要手動創建nginx組和nginx用戶
groupadd -r -g nginx
useradd
4、安裝nginx
./configure –prefix=/usr/local/nginx –user=nginx –group=nginx –with-threads –with-http_ssl_module –with-http_spdy_module –with-http_realip_module –with-http_addition_module –with-http_dav_module –with-http_gunzip_module –with-http_auth_request_module –with-http_gzip_static_module –with-http_degradation_module –with-http_stub_status_module –http-log-path=/var/log/nginx.log –with-http_perl_module –with-ld-opt="-Wl,-E" –error-log-path=/var/log/nginx_errorlog.log
注釋:–with-ld-opt="-Wl,-E" 加入perl模塊后需要加入這項,防止安裝完成后啟動nginx時報錯。這項的作用優化C編譯器
make && make instal
5、下面做的一些操作完全是為了保持使用yum方式安裝的習慣:配置文件的路徑,程序啟動使用簡單的命令而非完整的路徑等
-
cp /usr/local/nginx/sbin/nginx
/usr/sbin/nginx 這樣可以在任意路徑使用nginx命令,不需要使用完整的路徑:/usr/locla/ngins/sbin/nginx。當nginx重新編譯過后會產生新的nginx程序,這時候也要相應的將/usr/sbin/目錄里的nginx也更新了。也可以通過修改環境變量PATH的方式: echo "PATH=/usr/local/nginx/sbin/:$PATH" >> /etc/profilesource /etc/profile #使其立即生效
-
復制配置文件 mkdir /etc/nginx/ && cp /usr/local/nginx/conf/{nginx.conf,mime.types} /etc/nginx/
-
創建nginx的啟動腳本可以使用service方式啟動,重啟,查看狀態以及重載配置文件等。vim /etc/init.d/nginx
#!/bin/sh
#
# nginx – this script starts and stops the nginx daemon
#
# chkconfig: – 85 15 85表示啟動順序號,第85個啟動,15代表關閉順序號,第15個關閉
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/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
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*–user=\([^ ]*\).*/\1/g' -`
#nginx -V 2>&1 | grep "configure arguments:" | cut -d '-' -f 5 | cut -d '=' -f 2 等同于上面的代碼的功能
#[^*]* 表示把–user前面的內容去掉 \(表示轉義 [^ ]* 表示零個,一個或多個非空白字符 \([^ ]*\) 表示被引用的對象,
#后面的\1 就是引用這里括起來的內容
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
#make_dirs 函數的作用是先獲取nginx使用哪個用戶進行運行,然后將下面這些路徑的屬主改為該用戶。
#并且是遞歸的方式修改,也就是子文件夾及其里面所有文件的屬主都為此用戶。
# –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 \
start() {
[ -x $nginx ] || exit 5
#-x 表示/usr/local/nginx 是否有執行的權限,有就執行下一條命令并返回0.如果沒有就返回5并退出整個腳本
[ -f $NGINX_CONF_FILE ] || exit 6
#-f 表示/etc/nginx/nginx.conf是否存在。存在執行下一條命令返回0.沒有就返回6并退出整個腳本
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE #檢查nginx的配置文件
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT #運行killproc 需要先運行. /etc/rc.d/init.d/functions.
#使用function腳本提供的PATH變量,umask,以及語言環境等。killproc也在此腳本中.
#-QUIT 停止信號
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP #運行killproc 需要先運行. /etc/rc.d/init.d/functions 使用function腳本提供的PATH變量,
RETVAL=$? #umask,以及語言環境等。killproc也在此腳本中。-HUP 重載配置文件
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0 #如果在運行狀態,就返回0并且停止執行當前腳本,否則調用start函數
$1 #調用start() 函數
;;
stop)
rh_status_q || exit 0 #如果在運行狀態,就調用stop函數,否則返回0并停止執行當前腳本
$1 #調用stop() 函數
;;
restart|configtest) #restart 或者configtest 這兩個參數
$1 #調用restart() 函數 或者調用configtest函數
;;
reload)
rh_status_q || exit 7
$1 #調用reload() 函數
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
-
需要給此腳本添加執行的權限。chomd o+x /etc/init.d/nginx
-
設置開機自動啟動 chkconfig -add nginx;chkconfig nginx on
-
可以啟動nginx:service nginx start
-
ss -utnlp | grep 80 #nginx已經啟動,并且監聽在80套字節上
tcp LISTEN 0 128 *:80 *:* users:(("nginx",39796,6),("nginx",39797,6))
-
嘗試本機訪問nginx
[root@firewall nginx]# curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
至此nginx安裝完成
nginx基礎篇就寫在這里,下一篇寫nginx作為web服務器、web反向代理的具體實現。
原創文章,作者:jslijb,如若轉載,請注明出處:http://www.www58058.com/12850
代碼缺少格式化,難看了點
@stanley:上次說我沒有格式化,我這次特定做了格式化,可是還是說沒有格式化,那您能告訴我格式化的標準碼?否則我不知道如何達到您的要求。