Nginx是一個高性能WEB服務器,除它以外Apache、Tomcat、Jetty、IIS,它們都是Web服務器,或者叫作WWW(World Wide Web)服務器,相應地也都具有Web服務器的基本功能。Nginx 相對基它WEB服務有什麼優點呢?css
(1)Tomcat、Jetty 面向java語言,先天就是重量級的WEB服務器,其性能與Nginx沒有可比性。html
(2)IIS只能在Windows操做系統上運行。Windows做爲服務器在穩定性與其餘一些性能上都不如類UNIX操做系統,所以,在須要高性能Web服務器的場合下IIS並不佔優。java
(3)Apache的發展時期很長,並且是目前毫無爭議的世界第一大Web服務器,其有許多優勢,如穩定、開源、跨平臺等,但它出現的時間太長了,在它興起的年代,互聯網的產業規模遠遠比不上今天,因此它被設計成了一個重量級的、不支持高併發的Web服務器。在Apache服務器上,若是有數以萬計的併發HTTP請求同時訪問,就會致使服務器上消耗大量內存,操做系統內核對成百上千的Apache進程作進程間切換也會消耗大量CPU資源,並致使HTTP請求的平均響應速度下降,這些都決定了Apache不可能成爲高性能Web服務器,這也促使了Lighttpd和Nginx的出現。 下圖能夠看出07年到18 年強勁增加勢頭。linux
安裝環境準備nginx
(1)Liunx 內核 2.6 及以上版本 : 只有 2.6 以後才支持了 epoll,在此以前使用 select 或 poll 多路複用的 IO 模型,沒法解決高併發壓力的問題。經過命令 uname -a 便可查看。c++
#查看 linux 內核
uname -a
複製代碼
(2)GCC編譯器 GCC(GNU Compiler Collection)可用來編譯C語言程序。Nginx不會直接提供二進制可執行程序,只能下載源碼進行編譯。web
(3)PCRE庫 PCRE(Perl Compatible Regular Expressions,Perl兼容正則表達式)是由Philip Hazel開發的函數庫,目前爲不少軟件所使用,該庫支持正則表達式。正則表達式
(4)zlib庫 zlib庫用於對HTTP包的內容作gzip格式的壓縮,若是咱們在nginx.conf裏配置了gzip on,並指定對於某些類型(content-type)的HTTP響應使用gzip來進行壓縮以減小網絡傳輸量。windows
(5)OpenSSL開發庫 若是咱們的服務器不僅是要支持HTTP,還須要在更安全的SSL協議上傳輸HTTP,那麼就須要擁有OpenSSL了。另外,若是咱們想使用MD五、SHA1等散列函數,那麼也須要安裝它。安全
上面幾個庫都是Nginx 基礎功能所必需的,爲簡單起見咱們能夠經過yum 命令統一安裝。
#yum 安裝nginx 環境
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel
源碼獲取:
nginx 下載頁:http://nginx.org/en/download.html 。
** # 下載nginx 最新穩定版本
wget http://nginx.org/download/nginx-1.15.9.tar.gz
#解壓
tar -zxvf nginx-1.15.9.tar.gz
最簡單的安裝:
# 所有采用默認安裝
./configure
make && make install
執行完成以後 nginx 運行文件 就會被安裝在 /usr/local/nginx 下。
基於參數構建
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-debug
控制命令:
#默認方式啓動:
./sbin/nginx
#指定配置文件啓動
./sbing/nginx -c /tmp/nginx.conf
#指定nginx程序目錄啓動
./sbin/nginx -p /usr/local/nginx/
#快速中止
./sbin/nginx -s stop
#優雅中止
./sbin/nginx -s quit
# 熱裝載配置文件
./sbin/nginx -s reload
# 從新打開日誌文件
./sbin/nginx -s reopen
複製代碼
架構說明:
(1)nginx啓動時,會生成兩種類型的進程,一個是主進程(Master),一個(windows版本的目前只有一個)和多個工做進程(Worker)。主進程並不處理網絡請求,主要負責調度工做進程,也就是圖示的三項:加載配置、啓動工做進程及非停升級。因此,nginx啓動之後,查看操做系統的進程列表,咱們就能看到至少有兩個nginx進程。
(2)服務器實際處理網絡請求及響應的是工做進程(worker),在類unix系統上,nginx能夠配置多個worker,而每一個worker進程均可以同時處理數以千計的網絡請求。
(3)模塊化設計。nginx的worker,包括核心和功能性模塊,核心模塊負責維持一個運行循環(run-loop),執行網絡請求處理的不一樣階段的模塊功能,如網絡讀寫、存儲讀寫、內容傳輸、外出過濾,以及將請求發往上游服務器等。而其代碼的模塊化設計,也使得咱們能夠根據須要對功能模塊進行適當的選擇和修改,編譯成具備特定功能的服務器。
(4)事件驅動、異步及非阻塞,能夠說是nginx得以得到高併發、高性能的關鍵因素,同時也得益於對Linux、Solaris及類BSD等操做系統內核中事件通知及I/O性能加強功能的採用,如kqueue、epoll及event ports。
(1)配置文件語法格式
(2)配置第一個靜態WEB服務
(3)配置案例
a. 動靜分離實現
b. 防盜鏈
c. 多域名站點
d. 下載限速
e. IP 黑名單
f. 基於user-agent分流
複製代碼
(4)日誌配置
一、配置文件的語法格式: 先來看一個簡單的nginx 配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /nginx_status {
stub_status on;
access_log off;
}
}
}
複製代碼
上述配置中的events、http、server、location、upstream等屬於配置項塊。而worker_processes 、worker_connections、include、listen 屬於配置項塊中的屬性。 /nginx_status 屬於配置塊的特定參數參數。其中server塊嵌套於http塊,其能夠直接繼承訪問Http塊當中的參數。
配置塊 | 名稱開頭用大口號包裹其對應屬性 |
屬性 | 基於空格切分屬性名與屬性值,屬性值可能有多個項 都以空格進行切分 如:access_log logs/host.access.log main |
參數 | 其配置在 塊名稱與大括號間,其值若是有多個也是經過空格進行拆 |
注意 若是配置項值中包括語法符號,好比空格符,那麼須要使用單引號或雙引號括住配置項值,不然Nginx會報語法錯誤。例如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
複製代碼
二、配置第一個靜態WEB服務
基礎站點演示:
基本配置介紹說明:
(1)監聽端口 語法:listen address
: 默認:listen 80
; 配置塊:server
(2)主機名稱 語法:server_name name[……]
; 默認:server_name ""
; 配置塊:server
server_name
後能夠跟多個主機名稱,如server_name
www.testweb.com
、download.testweb.com
;。 支持通配符與正則
(3)location 語法:location[=|~|~*|^~|@]/uri/{……}
配置塊:server
動靜分離演示:
location /static
~* \.(gif|png|css|js)$
基於目錄動靜分離 server {
listen 80;
server_name *.luban.com;
root /usr/www/luban;
location / {
index luban.html;
}
location /static {
alias /usr/www/static;
}
}
複製代碼
基於正則動靜分離
location ~* \.(gif|jpg|png|css|js)$ {
root /usr/www/static;
}
複製代碼
防盜鏈配置演示: 加入至指定location 便可實現
valid_referers none blocked *.luban.com;
if ($invalid_referer) {
return 403;
}
複製代碼
下載限速:
location /download {
limit_rate 1m;
limit_rate_after 30m;
}
複製代碼
建立IP黑名單 建立黑名單文件
echo 'deny 192.168.0.132;' >> balck.ip
#http 配置塊中引入 黑名單文件
include black.ip;
複製代碼
三、日誌配置: 日誌格式:
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 logs/access.log main;
複製代碼
基於域名打印日誌
access_log logs/$host.access.log main;
複製代碼
error
日誌的設置
語法:error_log /path/file level
;
默認:error_log logs/error.log error
;
level
是日誌的輸出級別,取值範圍是debug、info、notice、warn、error、crit、alert、emerg
,針對指定的客戶端輸出debug級別的日誌
語法:debug_connection[IP|CIDR]
events {
debug_connection 192.168.0.147;
debug_connection 10.224.57.0/200;
}
複製代碼