1. 程式人生 > >輕鬆使用Nginx搭建web伺服器

輕鬆使用Nginx搭建web伺服器

如果讀者以前做過web開發的話,就應該知道如何去搭建一個web伺服器來跑你的web站點,在windows下你可能會選擇去用IIS,十分的快捷,在linux下,你可能首先會想到apache,“一哥”( W3Techs網站資料的排名)啦

clip_image002

      今天小編要介紹後起之秀nginx來實現web伺服器。小編在前面的部落格中也詳細的聊過apache的使用,如今又來說nginx的使用,讀者可能以後搭建web伺服器的話就不知道選用哪一種,O(∩_∩)O~,別急,小編這就來給讀者分析一下Nginx和Apache區別,以後讀者就可以根據自己web站點的特點來擇其優即可。

Project 1:Nginx和Apache的區別

1. apache 相對於nginx 的優點:

  • rewrite ,比nginx 的rewrite 強大
  • 動態頁面,nginx處理動態請求是雞肋,一般動態請求要apache去做,nginx只適合靜態和反向。
  • 模組超多,基本想到的都可以找到
  • 少bug ,nginx 的bug 相對較多超穩定

2. nginx相對於apache的優點:

  • 輕量級,同樣起web 服務,比apache佔用更少的記憶體及資源 ,支援更多的併發連線,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。在高連線併發的情況下,Nginx是Apache伺服器不錯的替代品: Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平臺之一. 能夠支援高達 50,000 個併發連線數的響應, 這歸功於Nginx為我們選擇了 epoll and kqueue 作為開發模型.
  • 抗併發,nginx 處理請求是非同步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高效能
  • 高度模組化的設計,編寫模組相對簡單
  • 社群活躍,各種高效能模組出品迅速啊
  • Nginx本身就是一個反向代理伺服器
  • 負載均衡能力突出,Nginx 既可以在內部直接支援 Rails 和 PHP 程式對外進行服務, 也可以支援作為 HTTP代理 伺服器對外進行服務. Nginx採用C進行編寫, 不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多.

3. 核心區別:apache是同步多程序模型,一個連線對應一個程序;nginx是非同步的,多個連線(萬級別)可以對應一個程序

一般來說,需要效能的web 服務,用nginx 。如果不需要效能只求穩定,那就apache 吧。後者的各種功能模組實現得比前者,例如ssl 的模組就比前者好,可配置項多。這裡要注意一點,epoll(freebsd 上是 kqueue )網路IO 模型是nginx 處理效能高的根本理由,但並不是所有的情況下都是epoll 大獲全勝的,如果本身提供靜態服務的就只有寥寥幾個檔案,apache 的select 模型或許比epoll 更高效能。

先說Select:

  • Socket數量限制:該模式可操作的Socket數由FD_SETSIZE決定,核心預設32*32=1024.
  • 操作限制:通過遍歷FD_SETSIZE個Socket來完成排程,不管哪個Socket是活躍的,都遍歷一遍(這就是apache慢的原因).

再說Epoll:

  • Socket數量無限制
  • 操作無限制:基於核心提供的反射模式,有活躍Socket時,核心訪問該Socket的callback,不需要遍歷輪詢(這當然是nginx快的原因啦).

原理部分小編覺得讀者知道這些就夠了,起碼當別人問起你選擇上述二者之一的理由你已經夠應付啦,當然小編還給你推薦一種折中的方案,nginx做前端,apache做後端啦

Project 2:安裝nginx

軟體需求:

Pcre以及pcre-devel,預設pcre是安裝的,pcre-devel需要使用yum安裝

Step 1:安裝pcre-devel,以及建立nginx使用者

# yum install pcre-devel

# groupadd -r nginx

# useradd -r -g nginx -M nginx

Step 2:解壓縮nginx的原始碼並安裝

# tar -zxvf nginx-1.3.16.tar.gz -C /usr/local/src/

# cd /usr/local/src/nginx-1.3.16/

# ./configure \

--conf-path=/etc/nginx/nginx.conf \

--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 \

--user=nginx \

--group=nginx \

--with-http_ssl_module \

--with-http_flv_module \

--with-http_stub_status_module \

--with-http_gzip_static_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/fcgi/ \

--with-pcre

# make && make install

# mkdir -p /var/tmp/nginx/client

Step 3:啟動nginx服務並在客戶端做測試

# /usr/local/nginx/sbin/nginx & //這裡小編還沒寫啟動指令碼,之後會附上

查詢nginx的啟動狀態

clip_image004

clip_image006

到這裡nginx的簡單安裝就算完成了

Project 3:靜態網頁的負載測試

前面總是說nginx在處理靜態網頁方面效能優越於apache,那這裡小編就來測試一下來試試,nginx的web站點主目錄在/usr/local/nginx/html,apache的web站點主目錄在/var/www/html,編寫一個相同的靜態頁面分別放到兩個web站點主目錄

Step 1:建立相同的測試頁

# rm –rf /usr/local/nginx/html/index.html //刪除原有的主頁

# echo "This is testPage." >/usr/local/nginx/html/index.html

# echo "This is testPage." >/var/www/html/index.html

Step 2:ab工具測試nginx

# pkill nginx

# /usr/local/nginx/sbin/nginx &

# ab -c 1000 -n 5000 http://192.168.111.10:80/

clip_image008

# ab -c 1000 -n 10000 http://192.168.111.10:80/

clip_image010

clip_image012

下面來測試一下apache的效能

# pkill nginx

# service httpd start

# ab -c 1000 -n 5000 http://192.168.111.10:80/

clip_image014

居然還沒當掉,那就來個10000的試試

clip_image016

好吧來50000的

clip_image018

讀者可以好好看看小編在圖片上圈的數字,很明顯nginx在處理靜態頁面方面很出色啦

Project 4:實現虛擬主機啦,這個是比較常用的功能啦

Nginx的配置檔案是比較簡潔啦,配置起來也不是那麼麻煩

基於IP的虛擬主機

Step 1:準備工作

增加一個網絡卡地址(原有的是192.168.111.10)

# ifconfig eth0:0 192.168.111.20

建立兩個站點目錄

# mkdir /website1

# mkdir /website2

建立兩個存放日誌的目錄

# mkdir /var/log/nginx/website1

# mkdir /var/log/nginx/website2

建立兩個測試頁

# echo "This is website1" >/website1/index.html

# echo "This is website2" >/website2/index.html

Step 2:修改配置檔案,原有的配置檔案中預設有一個server節點,修改一下,然後再新增一個server節點

server {

listen 192.168.111.10:80;

server_name localhost;

#charset koi8-r;

access_log /var/log/nginx/website1/access.log;

error_log /var/log/nginx/website1/error.log;

location / {

root /website1;

index index.html index.htm;

}

error_page 404 /404.html;

# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

server {

listen 192.168.111.20:80;

server_name localhost;

#charset koi8-r;

access_log /var/log/nginx/website2/access.log;

error_log /var/log/nginx/website2/error.log;

location / {

root /website2;

index index.html index.htm;

}

error_page 404 /404.html;

# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

Step 3:停掉原有的apache服務

# service httpd stop

# /usr/local/nginx/sbin/nginx &

Step 4:在客戶機分別訪問站點試試

clip_image020

clip_image022

基於主機頭的

Step 1:修改配置檔案

server {

listen 192.168.111.10:80;

server_name www.website1.com;

#charset koi8-r;

access_log /var/log/nginx/website1/access.log;

error_log /var/log/nginx/website1/error.log;

location / {

root /website1;

index index.html index.htm;

}

error_page 404 /404.html;

# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

server {

listen 192.168.111.20:80;

server_name www.website2.com;

#charset koi8-r;

access_log /var/log/nginx/website2/access.log;

error_log /var/log/nginx/website2/error.log;

location / {

root /website2;

index index.html index.htm;

}

error_page 404 /404.html;

# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

Step 2:修改本機的hosts檔案,並重啟nginx服務

192.168.111.10 www.website1.com

# pkill nginx

# /usr/local/nginx/sbin/nginx &

clip_image024

clip_image026

完成了吧,下面小編就來實現簡單的安全性的訪問(使用ssl來控制),這就涉及到證書的建立啦,這裡小編將該伺服器即作為web伺服器,又作為CA伺服器,如果作為CA伺服器,那麼首先的給CA建立證書

Project 5:

Step 1:配置建立證書的配置檔案,以及建立證書

# vim /etc/pki/tls/openssl.cnf

45行修改為dir = /etc/pki/CA

clip_image028

clip_image030

根據配置檔案的需求建立相關的資料夾和檔案

clip_image032

# mkdir certs crl newcerts

# touch index.txt serial

# echo 01 >>serial //初始化檔案

建立私鑰

# openssl genrsa 1024 >private/cakey.pem

# chmod 600 private/cakey.pem

生成證書檔案

clip_image034

Step 2:建立Nginx的安全目錄,並生成相關的私鑰和證書檔案

# mkdir /usr/local/nginx/certs

# cd /usr/local/nginx/certs/

# openssl genrsa 1024 >nginx.key

# chmod 600 nginx.key

因為小編的這臺伺服器即作為CA又作為web伺服器,所以可以證書申請的過程可以直接在本機做

clip_image036

生成證書

clip_image038

Step 3:修改nginx的配置檔案,新增用於安全訪問的站點

server {

listen 192.168.111.10:443;

server_name www.zzu.com;

ssl on;

ssl_certificate /usr/local/nginx/certs/nginx.cert;

ssl_certificate_key /usr/local/nginx/certs/nginx.key;

ssl_session_timeout 5m;

access_log /var/log/nginx/access.log;

error_log /var/log/nginx/error.log;

ssl_protocols SSLv2 SSLv3 TLSv1;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

location / {

root html;

index index.html index.htm;

}

}

Step 4:重啟nginx服務,修改客戶機的hosts檔案並訪問

# pkill nginx

# /usr/local/nginx/sbin/nginx &

修改hosts檔案

192.168.111.10 www.zzu.com

當首次訪問的時候會提示風險

clip_image040

clip_image042

既然沒有一個可信任的機構來承認這個證書,那麼小編就給一個機構唄,還記得小編最初給這臺伺服器生成的CA證書嗎,web網站的證書就是這個CA發的,如果客戶端信任這個CA了,那不就信任web的證書了麼,那麼就來實現吧,原理是使用證書鏈,在傳送web證書的時候附帶將其上級的證書帶過去

Step 5:修改web的證書,將CA的證書內容加進去,但是要注意加的順序,web證書的內容在前,CA證書在後

# cp /etc/pki/CA/cacert.pem /usr/local/nginx/certs

# cd /usr/local/nginx/certs/

# cat cacert.pem >> nginx.cert

重啟ngnix服務是必須的

# pkill nginx

# /usr/local/nginx/sbin/nginx &

客戶端訪問試試

clip_image044

繼續

clip_image046

繼續

clip_image048

GOON

clip_image050

clip_image052

clip_image054

clip_image056

clip_image058

clip_image060

點選“是”

clip_image062

關閉瀏覽器重新開啟試試

clip_image064

好啦,小編要實現的幾項已近完成了,當然這只是一些簡單的應用,在後面的博文中小編將會介紹如何搭建”LNMP”,

分類: 叢集