elasticsearch入門系列">elasticsearch入門系列
899
2022-05-29
Nginx?簡介
Nginx是一個高性能的Web?服務器,同時是一個高效的反向代理服務器,它還是一個IMAP/POP3/SMTP
代理服務器。
由于Nginx采用的是事件驅動的架構,能夠處理并發百萬級別的tcp連接,高度的模塊化設計和自由的BSD許可,使得Nginx有著非常豐富的第三方模塊。比如Openresty、API網關Kong。
BSD開源協議是一個給予使用者很大自由的協議。基本上使用者可以”為所欲為”,可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發布。
Nginx的優點
·??????高并發響應性能非常好,官方Nginx處理靜態文件并發5w/s
·??????反向代理性能非常強。(可用于負載均衡)
·??????內存和cpu占用率低。(為Apache的1/5-1/10)
·??????對后端服務有健康檢查功能。
·??????支持PHP cgi方式和fastcgi方式。
·??????配置代碼簡潔且容易上手。
Nginx的安裝
Centos系統安裝,請參考這里http://www.linuxidc.com/Linux/2016-09/134907.htm。先復制粘貼下它的文章。
1.gcc?安裝
安裝nginx?需要先將官網下載的源碼進行編譯,編譯依賴gcc?環境,如果沒有gcc?環境,則需要安裝:
yum install gcc-c++
2.PCRE pcre-devel?安裝
PCRE(Perl Compatible Regular Expressions)?是一個Perl庫,包括perl?兼容的正則表達式庫。nginx?的http?模塊使用pcre?來解析正則表達式,所以需要在linux?上安裝pcre?庫,pcre-devel?是使用pcre?開發的一個二次開發庫。nginx也需要此庫。命令:
yum install -y pcre pcre-devel
3.zlib?安裝
zlib?庫提供了很多種壓縮和解壓縮的方式,nginx?使用zlib?對http?包的內容進行gzip?,所以需要在Centos?上安裝zlib?庫。
yum install -y zlib zlib-devel
4.OpenSSL?安裝
OpenSSL?是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL?協議,并提供豐富的應用程序供測試或其它目的使用。
nginx?不僅支持http?協議,還支持https(即在ssl協議上傳輸http),所以需要在Centos?安裝OpenSSL?庫。
yum install -y openssl openssl-devel
5.官網下載
1.直接下載.tar.gz安裝包,地址:https://nginx.org/en/download.html
2.使用wget命令下載(推薦)。
wget -c https://nginx.org/download/nginx-1.10.1.tar.gz
6.解壓
依然是直接命令:
tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1
7.配置
其實在nginx-1.10.1?版本中你就不需要去配置相關東西,默認就可以了。當然,如果你要自己配置目錄也是可以的。
使用默認配置
./configure
8.編譯安裝
make
make install
查找安裝路徑:
whereis nginx
Nginx的模塊組成
Nginx的模塊從結構上分為核心模塊、基礎模塊和第三方模塊:
·??????核心模塊:HTTP模塊、EVENT模塊和MAIL模塊
·??????基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊,
·??????第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。
Nginx的高并發得益于其采用了epoll模型,與傳統的服務器程序架構不同,epoll是linux內核2.6以后才出現的。Nginx采用epoll模型,異步非阻塞,而Apache采用的是select模型。
·??????Select特點:select?選擇句柄的時候,是遍歷所有句柄,也就是說句柄有事件響應時,select需要遍歷所有句柄才能獲取到哪些句柄有事件通知,因此效率是非常低。
·??????epoll的特點:epoll對于句柄事件的選擇不是遍歷的,是事件響應的,就是句柄上事件來就馬上選擇出來,不需要遍歷整個句柄鏈表,因此效率非常高。
Nginx常用命令
nginx?環境變量配置:
export PATH=$PATH:/usr/servers/nginx/sbin
·??????查看nginx進程
ps -ef|grep nginx
·??????啟動nginx
nginx
啟動結果顯示nginx的主線程和工作線程,工作線程的數量跟nginx.conf中的配置參數worker_processes有關。
·??????平滑啟動nginx
kill -HUP?cat /var/run/nginx.pid
或者
nginx -s reload
·??????強制停止nginx
pkill -9 nginx
·??????檢查對nginx.conf文件的修改是否正確
nginx -t
·??????停止nginx的命令
nginx -s stop或者pkill nginx
·??????查看nginx的版本信息
nginx -v
·??????查看完整的nginx的配置信息
nginx -V
Nginx的配置
通常情況下,Nginx的配置在Ngix的安裝目錄下的/conf/config.default?文件里,基本配置如下:
worker_process?#?表示工作進程的數量,一般設置為cpu的核數
worker_connections?#?表示每個工作進程的最大連接數
server{}?#?塊定義了虛擬主機
listen?#?監聽端口
server_name?#?監聽域名
location?{}?#?是用來為匹配的?URI?進行配置,URI?即語法中的“/uri/”
location?/{}?#?匹配任何查詢,因為所有請求都以?/?開頭
root?#?指定對應uri的資源查找路徑,這里html為相對路徑,完整路徑為
#?/opt/nginx-1.7.7/html/
index?#?指定首頁index文件的名稱,可以配置多個,以空格分開。如有多
#?個,按配置順序查找。
location?常用配置如下:
模式
含義
location = /uri
=?表示精確匹配,只有完全匹配上才能生效
location ^~ /uri
^~?開頭對URL路徑進行前綴匹配,并且在正則之前。
location ~ pattern
開頭表示區分大小寫的正則匹配
location ~* pattern
開頭表示不區分大小寫的正則匹配
location /uri
不帶任何修飾符,也表示前綴匹配,但是在正則匹配之后
location /
通用匹配,任何未匹配到其它location的請求都會匹配到,相當于switch中的default
Nginx的常用配置非常多,以下內容摘自于布爾教育課件,僅供參考:
#定義Nginx運行的用戶和用戶組
user??www?www;
#啟動進程,通常設置成和cpu的數量相等
worker_processes??8;
worker_cpu_affinity?00000001?00000010?00000100?00001000?00010000?00100000?01000000?10000000;
#為每個進程分配cpu,上例中將8個進程分配到8個cpu,當然可以寫多個,或者將一個進程分配到多個cpu。
worker_rlimit_nofile?102400;
#這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打
#開文件數(ulimit?-n)與nginx進程數相除,但是nginx分配請求并不是那么均勻
#,所以最好與ulimit?-n的值保持一致。
#全局錯誤日志及PID文件
error_log??/usr/local/nginx/logs/error.log;
#錯誤日志定義等級,[?debug?|?info?|?notice?|?warn?|?error?|?crit?]
pid????????/usr/local/nginx/nginx.pid;
#一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit?-n)與nginx進程數相除,但是nginx分配請求并不均勻.
#所以建議與ulimit?-n的值保持一致。
worker_rlimit_nofile?65535;
#工作模式及連接數上限
events?{
use???epoll;?????????????????#epoll是多路復用IO(I/O?Multiplexing)中的一種方式,但是僅用于linux2.6以上內核,可以大大提高nginx的性能
worker_connections??102400;????#單個后臺worker?process進程的最大并發鏈接數?(最大連接數=連接數*進程數)
multi_accept?on;?#盡可能多的接受請求
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http?{
#設定mime類型,類型由mime.type文件定義
include???????mime.types;
default_type??application/octet-stream;
#設定日志格式
access_log????/usr/local/nginx/log/nginx/access.log;
sendfile??????on;
#sendfile?指令指定?nginx?是否調用?sendfile?函數(zero?copy?方式)來輸出文件,對于普通應用必須設為?on
#如果用來進行下載等應用磁盤IO重負載應用,可設置為?off,以平衡磁盤與網絡I/O處理速度,降低系統的uptime.
#autoindex??on;??#開啟目錄列表訪問,合適下載服務器,默認關閉。
tcp_nopush?on;?#防止網絡阻塞
keepalive_timeout?60;
#keepalive超時時間,客戶端到服務器端的連接持續有效時間,當出現對服務器的后,繼請求時,keepalive-timeout功能可避免建立或重新建立連接。
tcp_nodelay???on;?#提高數據的實時響應性
#開啟gzip壓縮
gzip?on;
gzip_min_length??1k;
gzip_buffers?????4?16k;
gzip_http_version?1.1;
gzip_comp_level?2;?#壓縮級別大小,最大為9,值越小,壓縮后比例越小,CPU處理更快。
#值越大,消耗CPU比較高。
gzip_types???????text/plain?application/x-javascript?text/css?application/xml;
gzip_vary?on;
client_max_body_size?10m;??????#允許客戶端請求的最大單文件字節數
client_body_buffer_size?128k;??#緩沖區代理緩沖用戶端請求的最大字節數,
proxy_connect_timeout?90;??????#nginx跟后端服務器連接超時時間(代理連接超時)
proxy_send_timeout?90;?????????#后端服務器數據回傳時間(代理發送超時)
proxy_read_timeout?90;?????????#連接成功后,后端服務器響應時間(代理接收超時)
proxy_buffer_size?4k;??????????#設置代理服務器(nginx)保存用戶頭信息的緩沖區大小
proxy_buffers?4?32k;???????????#proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設置
proxy_busy_buffers_size?64k;???#高負荷下緩沖大小(proxy_buffers*2)
#設定請求緩沖
large_client_header_buffers??4?4k;
client_header_buffer_size?4k;
#客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k
#不過由于一般系統分頁都要大于1k,所以這里設置為分頁大小。分頁大小可以用命令getconf?PAGESIZE取得。
open_file_cache?max=102400?inactive=20s;
#這個將為打開文件指定緩存,默認是沒有啟用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求后刪除緩存。
open_file_cache_valid?30s;
#這個是指多長時間檢查一次緩存的有效信息。
open_file_cache_min_uses?1;
#open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive
#包含其它配置文件,如自定義的虛擬主機
include?vhosts.conf;
}
配置詳解2如下:
#這里為后端服務器wugk應用集群配置,根據后端實際情況修改即可,tdt_wugk為負載均衡名稱,可以任意指定
#但必須跟vhosts.conf虛擬主機的pass段一致,否則不能轉發后端的請求。weight配置權重,在fail_timeout內檢查max_fails次數,失敗則剔除均衡。
upstream?tdt_wugk?{
server???127.0.0.1:8080?weight=1?max_fails=2?fail_timeout=30s;
server???127.0.0.1:8081?weight=1?max_fails=2?fail_timeout=30s;
}
#虛擬主機配置
server?{
#偵聽80端口
listen???????80;
#定義使用www.wuguangke.cn訪問
server_name??www.wuguangke.cn;
#設定本虛擬主機的訪問日志
access_log??logs/access.log??main;
root???/data/webapps/wugk;??#定義服務器的默認網站根目錄位置
index?index.php?index.html?index.htm;???#定義首頁索引文件的名稱
#默認請求
location?~?/{
root???/data/www/wugk;??????#定義服務器的默認網站根目錄位置
index?index.php?index.html?index.htm;???#定義首頁索引文件的名稱
#以下是一些反向代理的配置.
proxy_next_upstream?http_502?http_504?error?timeout?invalid_header;
#如果后端的服務器返回502、504、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另一臺服務器,實現故障轉移。
proxy_redirect?off;
#后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header?Host?$host;
proxy_set_header?X-Real-IP?$remote_addr;
proxy_set_header?X-Forwarded-For?$proxy_add_x_forwarded_for;
proxy_pass??http://tdt_wugk;?????#請求轉向后端定義的均衡模塊
}
#?定義錯誤提示頁面
error_page???500?502?503?504?/50x.html;
location?=?/50x.html?{
root???html;
}
#配置Nginx動靜分離,定義的靜態頁面直接從Nginx發布目錄讀取。
location?~?.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root?/data/www/wugk;
#expires定義用戶瀏覽器緩存的時間為3天,如果靜態頁面不常更新,可以設置更長,這樣可以節省帶寬和緩解服務器的壓力。
expires??????3d;
}
#PHP腳本請求全部轉發到?FastCGI處理.?使用FastCGI默認配置.
location?~?\.php$?{
root?/root;
fastcgi_pass?127.0.0.1:9000;
fastcgi_index?index.php;
fastcgi_param?SCRIPT_FILENAME?/data/www/wugk$fastcgi_script_name;
include?fastcgi_params;
}
#設定查看Nginx狀態的地址
location?/NginxStatus?{
stub_status??on;
}
}
}
Nginx?內置綁定變量
名稱
說明
$arg_name
請求中的name參數
$args
請求中的參數
$binary_remote_addr
遠程地址的二進制表示
$body_bytes_sent
已發送的消息體字節數
$content_length HTTP
請求信息里的”Content-Length”
$content_type
請求信息里的”Content-Type”
$document_root
針對當前請求的根路徑設置值
$document_uri
與$uri相同;?比如/test2/test.php
$host
請求信息中的”Host”,如果請求中沒有Host行,則等于設置的服務器名
$hostname
機器名使用gethostname系統調用的值
$http_cookie
cookie?信息
$http_referer
引用地址
$http_user_agent
客戶端代理信息
$http_via
最后一個訪問服務器的Ip地址。
$http_x_forwarded_for
相當于網絡訪問路徑
$is_args
如果請求行帶有參數,返回“?”,否則返回空字符串
$limit_rate
對連接速率的限制
$nginx_version
當前運行的nginx版本號
$pid worker
進程的PID
$query_string
與$args相同
$realpath_root
按root指令或alias指令算出的當前請求的絕對路徑。其中的符號鏈接都會解析成真是文件路徑,使用Nginx?內置綁定變量
207$remote_addr
客戶端IP地址
$remote_port
客戶端端口號
$remote_user
客戶端用戶名,認證用
$request
用戶請求
$request_body
這個變量(0.7.58+)包含請求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比較有意義
$request_body_file
客戶端請求主體信息的臨時文件名
$request_completion
如果請求成功,設為”OK”;如果請求未完成或者不是一系列請求中最后一部分則設為空
$request_filename
當前請求的文件路徑名,比如/opt/nginx/www/test.php
$request_method
請求的方法,比如”GET”、”POST”等
$request_uri
請求的URI,帶參數
$scheme
所用的協議,比如http或者是https
$server_addr
服務器地址,如果沒有用listen指明服務器地址,使用這個變量將發起一次系統調用以取得地址(造成資源浪費)
$server_name
請求到達的服務器名
$server_port
請求到達的服務器端口號
$server_protocol
請求的協議版本,”HTTP/1.0”或”HTTP/1.1”
$uri
請求的URI,可能和最初的值有不同,比如經過重定向之類的
參考資料
http://www.linuxidc.com/Linux/2016-09/134907.htm
https://moonbingbing.gitbooks.io/openresty-best-practices/content/ngx/nginx.html
布爾教育課件
方志朋簡介:SpringCloud中國社區聯合創始人,博客訪問量突破一千萬,愛好開源,熱愛分享,活躍于各大社區,保持著非常強的學習驅動力,終身學習踐行者,終身學習受益者。目前就職于國內某家知名互聯網保險公司,擔任DEVOPS工程師,對微服務領域和持續集成領域研究較深,精通微服務框架SpringCloud
Nginx HTTP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。