如果讀者以前做過web開發的話,就應該知道如何去搭建一個web服務器來跑你的web站點,在windows下你可能會選擇去用IIS,十分的快捷,在linux下,你可能首先會想到apache,“一哥”( W3Techs網站數據的排名)啦
今天小編要介紹后起之秀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
軟件需求:
官方最新的是nginx-1.3.16.tar.gz
官方最新libevent-2.0.21-stable.tar.gz 提供事件處理機制,linux 5.4 自帶的也可以,默認安裝了
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的啟動狀態
客戶機瀏覽器輸入http://192.168.111.10試試
到這里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/
# ab -c 1000 -n 10000 http://192.168.111.10:80/
# ab -c 1000 -n 50000 http://192.168.111.10:80/
下面來測試一下apache的性能
# pkill nginx
# service httpd start
# ab -c 1000 -n 5000 http://192.168.111.10:80/
居然還沒當掉,那就來個10000的試試
# ab -c 1000 -n 10000 http://192.168.111.10:80/
好吧來50000的
讀者可以好好看看小編在圖片上圈的數字,很明顯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:在客戶機分別訪問站點試試
基於主機頭的
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
192.168.111.10 www.website2.com
# pkill nginx
# /usr/local/nginx/sbin/nginx &
Step 3:在瀏覽器分別輸入www.website1.com和www.website2.com試試
完成了吧,下面小編就來實現簡單的安全性的訪問(使用ssl來控制),這就涉及到證書的創建啦,這里小編將該服務器即作為web服務器,又作為CA服務器,如果作為CA服務器,那么首先的給CA創建證書
Project 5:
Step 1:配置創建證書的配置文件,以及創建證書
# vim /etc/pki/tls/openssl.cnf
45行修改為dir = /etc/pki/CA
根據配置文件的需求創建相關的文件夾和文件
# mkdir certs crl newcerts
# touch index.txt serial
# echo 01 >>serial //初始化文件
創建私鑰
# openssl genrsa 1024 >private/cakey.pem
# chmod 600 private/cakey.pem
生成證書文件
Step 2:建立Nginx的安全目錄,並生成相關的私鑰和證書文件
# mkdir /usr/local/nginx/certs
# cd /usr/local/nginx/certs/
# openssl genrsa 1024 >nginx.key
# chmod 600 nginx.key
因為小編的這台服務器即作為CA又作為web服務器,所以可以證書申請的過程可以直接在本機做
生成證書
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
當首次訪問的時候會提示風險
既然沒有一個可信任的機構來承認這個證書,那么小編就給一個機構唄,還記得小編最初給這台服務器生成的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 &
客戶端訪問試試
繼續
繼續
GOON
點擊“是”
關閉瀏覽器重新打開試試
好啦,小編要實現的幾項已近完成了,當然這只是一些簡單的應用,在后面的博文中小編將會介紹如何搭建”LNMP”,