Nginx簡介
Nginx是一個高性能WEB服務器,除了它之外還有Apache、Tomcat、Jetty、IIS等都是WEB服務器。相應的也都有具備Web服務的基本功能。
Nginx的優勢
- Tomcat、Jetty面向java語言,先天就是重量級的Web服務器。
- IIS只能在Windows操作系統上運行,但是Window作爲服務器從穩定性等方面都不如類似UNIX等系統,所以需要高性能Web服務器的場合下IIS並不佔優勢;
- Apache的發展時期很長,作爲世界第一大Web服務器,它有許多優點,如穩定、開源、跨平臺等。但是由於長期發展,性能完善,逐漸被設計成一個重量級、不支持高併發的Web服務器。若有數以萬計的HTTP請求同時訪問,就會導致服務器上消耗大量內存,操作系統內核對成百上千Apache進程進行管理也會消耗大量CPU資源。
Nginx的編譯與安裝
安裝環境準備
Linux內核2.6以上版本
因爲只有2.6之後才支持epool,在此之前使用select或pool多路複用IO模型,無法解決高併發壓力的問題。可以通過uname -a
來查看系統內核版本。
GCC編譯器
GCC(GNU Compiler Conllection)可用來編譯C語言程序,Nginx不會直接提供二進制可執行程序,只能下載源碼進行編譯;
PCRE庫
PCRE(Perl Compatible Regular Expressions)該庫支持正則表達式;
zlib庫
用於對HTTP包的內容做gzip格式的壓縮,可以減少網絡傳輸量。
OpenSSL開發庫
爲了能支持在更安全的SSL協議上傳輸HTTP,另外還支持MD5、SHA1等散列函數。
[root@localhost installpack]# yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel
下載nginx源碼
官網下載:http://nginx.org/en/download.html
解壓
tar -zxvf nginx-1.18.0.tar.gz
編譯安裝
./configure && make && make install
查看版本
[root@localhost sbin]# pwd
/usr/local/nginx/sbin
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.18.0
啓動
./nginx
瀏覽器訪問
更新nginx配置模塊
模塊更新
./configure --with-pcre --with-http_stub_status_module --with-http_ssl_module
make
備份之前的配置
將目前的配置拷貝到安裝目錄
nginx控制命令
#查看命令幫助
./sbin/nginx -?
#默認方式啓動
./sbin/nginx
#指定配置文件啓動
./sbin/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
#設置全局命令
./sbin/nginx -g "user root;"
Nginx架構說明
-
Master進程:不處理網絡請求,主要負責調度工作進程,加載配置,啓動工作進程及非停止升級,所以,nginx啓動以後,查看操作系統的進程列表,就能看到至少有兩個nginx進程;
-
服務器實際上處理網絡請求及相應的是工作進程(Worker),在類UNIX系統上,nginx可以配置多個worker,而每個worker進程都可以同時處理數以千計的網絡請求。
-
模塊化設計:nginx的worker包括核心和功能性模塊。核心模塊負責爲之一個運行循環,執行網絡請求處理的不同階段的模塊功能,如網絡讀寫、存儲讀寫、內容傳輸、外出過濾,以及將請求發往上游服務器等。而其代碼的模塊化設計,也使得我們可以根據需要對其功能模塊進行適當的選擇和修改,編譯成具有特定功能的服務器。
-
事件驅動、異步及非阻塞,可以說是nginx的一獲得高併發、高性能的關鍵隱私,同時得益於對Linux、Solaris等操作系統內核中事件通知及IO性能增強功能的採用,如kqueue、epoll及event ports。
Nginx核心模塊
核心模塊的講解以及用法:http://nginx.org/en/docs/
Nginx配置與使用
配置文件的語法格式
基礎配置說明
#屬性 屬性參數
#配置nginx worker進程數量
worker_processes 1;
#配置塊
#時間模塊配置
events {
#屬性
#每個worker 進程可以接受最大連接數
worker_connections 1024;
}
# http服務根路徑,裏面可以包含多個server
http {
# 參數
include mime.types;
default_type application/octet-stream;
# 是否可以發送文件
sendfile on;
# 超時時間
keepalive_timeout 65;
#server 模塊
server {
# 監聽端口
listen 80;
# 指向哪個服務器,可以有多個,匹配優先級:全路徑匹配 > 通配符匹配左邊大於右邊
server_name localhost;
# 可以有多個location,指定訪問路徑
location / {
# 當前站點的根目錄(相對於nginx)
root html;
index index.html index.htm;
}
location /static {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#server 模塊
server {
# 監聽端口
listen 80;
# 服務域名設置
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置靜態代理
新增配置
server {
listen 80;
server_name www.hello.com;
root /www/hello/;
location / {
index index.html;
}
}
檢查配置是否有語法錯誤
重新加載配置
更改本地hosts文件
location
語法:location[=|~|~*|^~|@]/url/{......}
- =表示把URI作爲字符串,以便參數中的uri做完全匹配;
- / 基於uri目錄匹配
- ~ 表示正則匹配URI時是字母大小寫敏感的;
- ~* 表示正則匹配URI時忽略字母大小寫;
- ^~ 表示正則匹配URl是隻需要前半部分與uri參數匹配即可。
匹配優先規則
精確匹配 > 正則匹配 > 前綴最大匹配 > 配置靠前
root指定站點根目錄
可配置在server與location中,基於ROOT路徑+URL中路徑去尋找指定文件;
alias指定站點別名
只能配置location中,基於alias路徑+URL移除location 前綴後的路徑來尋找文件;
配置動靜分離代理
- 創建靜態站點
- 配置location /static
- 配置 ~*.(gif|png|css|js)$
基於目錄動靜分離
# 基於目錄訪問
location /static {
autoindex on;
alias /www/static;
}
# 基於正則表達式匹配
location ~* \.(gif|jpg|png|css|js)$ {
root /www/static;
}
防盜鏈配置
location裏面加上,只有hello域名能訪問。
invalid_referers none blocked *.hello.com;
if($invalid_referers){
return 403;
}
新增一個域名
通過兩個域名都可以訪問圖片;
給圖片添加防盜鏈
location ~* \.(gif|jpg|png|css|js)$ {
valid_referers none blocked *.hello.com;
if ( $invalid_referer ){
return 403;
}
root /www/static;
}
}
除了hello域名,別的路徑都訪問不到圖片了。
下載限速
location /download {
limit_rate 1m; #限制每秒下載速度;
limit_rate_after 30m; //下載30m之後再限速
}
創建IP黑名單
# 封禁指定IP
deny IP;
allow IP;
# 開放指定IP段
allow IP/子網掩碼
# 封禁所有
deny all;
#開放所有
allow all;
#創建黑名單文件
echo 'deny IP;' >> balck.ip
# http配置塊中引入黑名單文件
include black.ip