我們之前有分析過,單臺服務器可能會遇到的問題,比如服務器宕機,或者并發用戶太多,單臺服務器不夠等問題,所以需要集群架構,就是將項目部署到多臺服務器。
但這樣會出現新的問題:
對于這些問題的出現,我們可以用Nginx來解決,除此以外,Nginx還可以幫助我們區分動態服務器和靜態服務器。
Nginx (engine x) 是一個高性能的Http服務器和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。它可以用做反向代理服務器,郵件服務器,實現負載均衡和動靜分離。
穩定性強、豐富的功能集、簡單的配置文件和低系統資源的消耗,占用內存少,并發能力強。
中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
docker pull daocloud.io/library/nginx:latest
docker images
docker run -d -p 80:80 --name nginx 29
先進入Nginx容器內部
docker exec -it 容器id bash #進入容器的終端,可以執行一些如ls pwd等一些簡單的shell命令
再進入容器的etc/nginx目錄下:
將nginx.conf文件的內容復制出來
# 全局塊
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#events塊
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
全局塊:
從配置文件開始到 events 塊之間的內容,主要會設置一些影響nginx 服務器整體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日志存放路徑和類型以及配置文件的引入等。
worker_processes 1 #這是 Nginx 服務器并發處理服務的關鍵配置,worker_processes 值越大,可以支持的并發處理量也越多,但是會受到硬件、軟件等設備的制約。
events 塊:
events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啟對多 work process 下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等。 上述例子就表示每個 work process 支持的最大連接數為 1024. 這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置。
http塊:
http模塊顧名思義,就是關于http服務請求的配置。這些配置包括http請求的文件類型(MIME-TYPE)的定義,http請求日志的輸出,http連接的超時時長,單連接請求上限的配置。
http塊的最后一句#include /etc/nginx/conf.d/*.conf ,是指引入了conf.d目錄下的以.conf為結尾的配置文件。我們找到他們。
default.conf內容如下:
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
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 /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
去掉注釋部分
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location=/50x.html {
root /usr/share/nginx/html;
}
}
將其替換到nginx.conf文件中的include /etc/nginx/conf.d/*.conf,然后可以看到http塊的內容為:
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location=/50x.html {
root /usr/share/nginx/html;
}
}
}
http塊結構包含:
server塊: 每一個Server模塊就是一個獨立的虛擬主機,每個虛擬的主機可配置不同的域名或IP地址
?
今天主要分享怎么去用NGINX來提供靜態內容服務,定義搜索路徑以查找請求的文件的方法,以及如何設置索引文件。
在這個部分,主要涉及以下幾個方面的內容:
指令指定將用于搜索文件的根目錄。 要獲取請求文件的路徑,NGINX將請求URI附加到root指令指定的路徑。 該指令可以放置在http,server或location上下文中的任何級別上。 在下面的示例中,為虛擬服務器定義了root指令。 它適用于不包括root指令的所有location塊以顯式重新定義根:
server { root /www/data; location / { } location /images/ { } location ~ \.(mp3|mp4) { root /www/media; } }
這里,NGINX在文件系統的/www/data/images/目錄中搜索以/images/開頭的URI。 但是,如果URI以.mp3或.mp4擴展名結尾,則NGINX會在/www/media/目錄中搜索.mp3或.mp4文件,因為它在匹配的location塊中定義。
如果請求以斜杠結尾,則NGINX將其視為對目錄的請求,并嘗試在目錄中找到索引文件。index指令定義索引文件的名稱(默認值為index.html)。繼續示例,如果請求URI為/images/some/path/,則NGINX會傳遞文件/www/data/images/some/path/index.html(如果存在)。 如果不存在文件,NGINX默認返回HTTP代碼404(未找到)。 要配置NGINX以返回自動生成的目錄列表,請將on參數添加到autoindex指令中:
location /images/ { autoindex on; }
可以在索引指令中列出多個文件名。 NGINX以指定的順序搜索文件,并返回它找到的第一個文件。
location / { index index.$geo.html index.html index.html; }
這里使用的$geo變量是通過指令設置的自定義變量。 變量的值取決于客戶端的IP地址。
指令可用于檢查指定的文件或目錄是否存在并進行內部重定向,如果沒有指定的文件或目錄,則返回特定的狀態代碼。 例如,要檢查與請求URI相對應的文件的存在,請使用try_files指令和$uri變量,如下所示:
server { root /www/data; location /images/ { try_files $uri /images/default.gif; } }
該文件以URI的形式指定,它使用在當前位置或虛擬服務器的上下文中設置的 root 或 alias 偽指令進行處理。 在這種情況下,如果與原始URI相對應的文件不存在,則NGINX將內部重定向到最后一個參數中指定的URI,也就是返回/www/data/images/default.gif。
最后一個參數也可以是一個狀態代碼(直接在前面的等號)或位置的名稱。 在以下示例中,如果try_files指令的任何參數都不會解析為現有文件或目錄,則會返回404錯誤。
location / { try_files $uri $uri/ $uri.html=404; }
在下一個示例中,如果原始URI和帶有附加尾部斜線的URI都不能解析為現有文件或目錄,則將請求重定向到將其傳遞給代理服務器的命名位置(location)。
location / { try_files $uri $uri/ @backend; } location @backend { proxy_pass http://backend.example.com; }
加載速度是服務任何內容的關鍵因素。 對您的NGINX配置進行小幅優化可能會提高生產力并幫助實現最佳性能。
啟用sendfile
默認情況下,NGINX會自動處理文件傳輸,并在發送文件之前將其復制到緩沖區中。 啟用指令將消除將數據復制到緩沖區中的步驟,并允許將數據從一個文件描述符直接復制到另一個文件描述符。 或者,為了防止一個快速連接完全占用工作進程,您可以通過定義指令來限制在單個sendfile()調用中傳輸的數據量:
location /mp3 { sendfile on; sendfile_max_chunk 1m; ... }
啟用tcp_nopush
將選項與sendfile一起使用。 該選項將使NGINX能夠通過sendfile獲取數據塊之后,在一個數據包中發送HTTP響應頭
location /mp3 { sendfile on; tcp_nopush on; ... }
啟用tcp_nodelay
選項可以覆蓋Nagle的算法,最初是為了解決慢網絡中的小數據包問題而設計的。 該算法將大量小數據包整合到較大的數據包中,并以200 ms的延遲發送數據包。
如今,當服務大型靜態文件時,無論數據包大小如何,都可以立即發送數據。 延遲也會影響在線應用程序(ssh,在線游戲,網上交易)。 默認情況下,tcp_nodelay指令設置為on,表示Nagle的算法被禁用。 該選項僅用于Keepalive連接:
location /mp3 { tcp_nodelay on; keepalive_timeout 65; ... }
上面就是關于Nginx配置靜態內容服務器的一些參數介紹了,大家有興趣的話可以自己在虛擬機搭建一下做個小測試,后期主要分享運維DBA和devops內容,感興趣的朋友可以關注下!
一、前言
二、Nginx介紹
三、如何安裝
1)從官網下載源碼包
2)配置環節
3)編譯構建環節
4)安裝
四、基礎知識-模塊架構
五、基礎知識-多進程模型
1)概覽
2)異步非阻塞機制
3)職責分工
4)熱更新原理
5)最大并發連接數計算
六、基礎知識-請求執行流程
七、基礎知識-服務動靜分離
八、基礎知識-負載均衡
1)簡介
2)如何配置
3)upstream參數
4)配置示例
九、基礎知識-文件目錄
1)源代碼目錄
2)配置后程序目錄
3)編譯后程序目錄
十、 基礎知識-配置文件
十一、基礎知識-常用命令
十二、基礎知識-gzip壓縮
十三、遇到的問題
首先,我們來看一張關于正向代理和反向代理的圖片
簡單理解正向代理和反向代理的概念:
*簡單理解正向代理和反向代理的共同點:
*簡單理解正向代理和反向代理的區別:
而nginx就是比較流行的反向代理組件。
Nginx (engine x) 是一個高性能的http和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,公開版本1.19.6發布于2020年12月15日。
Nginx將源代碼以類BSD許可證的形式發布,因它的穩定性、豐富的功能集、簡單的配置文件和低系統資源的消耗而聞名。2022年01月25日,nginx 1.21.6發布。
其特點是占有內存少,并發能力強,事實上nginx的并發能力在同類型的網頁服務器中表現較好。
優點
nginx作為開源軟件,文檔齊全,社區活躍,可以免費使用以及二次開發。這個是最重要的優點,哈哈~ 畢竟如果需要付費使用的話,大部分小企業都不會愿意采用了。
nginx 是一個安裝非常的簡單、配置文件非常簡潔(還能夠支持perl語法)的服務。Nginx 啟動也特別容易,還能夠在不間斷服務的情況下進行軟件版本的熱更新。
nginx是Bug非常少的服務,用于反向代理,宕機的概率微乎其微,并且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。
nginx可以在大多數Unix Linux OS 上編譯運行,并有Windows移植版
官方測試數據顯示nginx能同時支持高達50000個并發連接數的響應,在實際生產環境中跑到2-3萬并發。
nginx采用C進行編寫,不論是系統資源開銷還是CPU使用效率都是比較好的。
nginx提供了很多開箱即用的功能模塊,如果不需要可以通過參數關閉。
其實還可以列出很多優點,每個人總結的優點都會不一樣啦,總之小郭就是想強調這款程序非常優秀!
小郭采用下載nginx源碼編譯的方式進行安裝
Nginx 使用 Unix 下常用的 './configure && make && make install' 過程來完成配置、編譯構建、安裝。
官方下載連接:https://nginx.org/en/download.html
小郭這里選取了nginx-1.9.9的linux版本下載,如果你對版本功能有特殊要求,按需選擇哦!
configure 腳本負責在我們使用的系統上準備好軟件的構建環境。確保接下來的構建和安裝過程所需要的依賴準備好,并且搞清楚使用這些依賴需要的東西。
configure命令的作用主要是根據當前系統環境是生成Makefile文件(指定安裝路徑;自動設定源程序以符合各種不同平臺上Unix系統的特性)。
在前面的步驟1已經下載好了源碼包,我們將其解壓:
#我的安裝包存放目錄是/home/guoyd
cd /home/guoyd
tar -zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
接下來使用configure命令對源碼進行配置
nginx支持很多擴展功能,有很多功能模塊可以選擇開啟或者關閉,因此通過configure命令按需自己編譯比較合適。
可以通過命令`./configure --help` 查看支持的參數選項:
[root@iZbp128dczen7roibd3xciZ nginx-1.9.9]# ./configure --help
--help print this message
#Nginx安裝路徑。如果沒有指定,默認為 /usr/local/nginx
--prefix=PATH
#Nginx可執行文件安裝路徑。只能安裝時指定,如果沒有指定,默認為/sbin/nginx
--sbin-path=PATH
#在沒有給定-c選項下默認的nginx.conf的路徑。如果沒有指定,默認為/conf/nginx.conf
--conf-path=PATH
#在nginx.conf中沒有指定error_log指令的情況下,默認的錯誤日志的路徑。如果沒有指定,默認為 /logs/error.log
--error-log-path=PATH
#在nginx.conf中沒有指定pid指令的情況下,默認的nginx.pid的路徑。如果沒有指定,默認為 /logs/nginx.pid
--pid-path=PATH
#nginx.lock文件的路徑
--lock-path=PATH
#在nginx.conf中沒有指定user指令的情況下,默認的nginx使用的用戶。如果沒有指定,默認為 nobody
--user=USER
#在nginx.conf中沒有指定group指令的情況下,默認的nginx使用的組。如果沒有指定,默認為 nobody
--group=GROUP
#指定編譯的名稱
--build=NAME
#指定編譯的目錄
--builddir=DIR
#允許開啟SELECT模式,如果 configure 沒有找到更合適的模式,比如:kqueue(sun os),epoll (linux kenel 2.6+),rtsig(實時信號)或者/dev/poll(一種類似select的模式,底層實現與SELECT基本相 同,都是采用輪訓方法) SELECT模式將是默認安裝模式
--with-select_module
#禁用SELECT模式
--without-select_module
#啟用 poll 模塊支持(功能與 select 相同,與 select 特性相同,為一種輪詢模式,不推薦在高負載環境下使用)
--with-poll_module
#禁用 poll 模塊支持
--without-poll_module
#開啟線程池支持(社區版從1.7.11開始引入線程池, 默認不開啟時無論是master進程,還是worker進程的線程數都是1)
--with-threads
#啟用 file aio 支持(一種 APL 文件傳輸格式)
--with-file-aio
#啟用 ipv6 支持
--with-ipv6
#開啟HTTP SSL模塊,使NGINX可以支持HTTPS請求。這個模塊需要已經安裝了OPENSSL,在DEBIAN上是libssl
--with-http_ssl_module
#啟用對HTTP/2的支持,并取代ngx_http_spdy_module模塊
--with-http_v2_module
#啟用 ngx_http_realip_module 支持(這個模塊允許從請求標頭更改客戶端的 IP 地址值,默認為關)
--with-http_realip_module
#啟用 ngx_http_addition_module 支持(作為一個輸出過濾器,支持不完全緩沖,分部分響應請求)
--with-http_addition_module
#啟用 ngx_http_xslt_module 支持(過濾轉換 XML 請求)
--with-http_xslt_module
#啟用 ngx_http_image_filter_module 支持(傳輸 JPEG/GIF/PNG 圖片的一個過濾器)(默認為不啟用。GD 庫要用到)
--with-http_image_filter_module
#啟用 ngx_http_geoip_module 支持(基于與 MaxMind GeoIP 二進制文件相配的客戶端 IP 地址的 ngx_http_geoip_module 變量)
--with-http_geoip_module
#啟用 ngx_http_sub_module 支持(允許用一些其他文本替換 Nginx 響應中的一些文本)
--with-http_sub_module
#啟用 ngx_http_dav_module 支持(增加 PUT、DELETE、MKCOL 創建集合,COPY 和 MOVE 方法)默認情況下為關閉,需編譯開啟
--with-http_dav_module
#啟用 ngx_http_flv_module 支持(提供尋求內存使用基于時間的偏移量文件)
--with-http_flv_module
#啟用ngx_http_mp4_module 模塊為 MP4 文件提供偽流服務端支持。這些文件的擴展名通常為 .mp4、.m4v 或 .m4a。
--with-http_mp4_module
#啟用ngx_http_gunzip_module模塊為不支持"gzip"編碼方式的客戶端解壓縮頭"Content-Encoding:gzip"提供的過濾器。
--with-http_gunzip_module
#啟用ngx_http_gzip_static_module模塊,開啟預讀gzip功能,允許發送.gz擴展名文件進行響應。
--with-http_gzip_static_module
#啟用ngx_http_auth_request_module模塊(1.5.4)基于子請求的結果實現客戶端授權。如果子請求返回 2xx 響應代碼,則允許訪問。如 果返回 401 或 403,則使用相應的錯誤代碼拒絕訪問。子請求返回的任何其他響應代碼都被視為錯誤
--with-http_auth_request_module
#啟用 ngx_http_random_index_module 支持(從目錄中隨機挑選一個目錄索引)
--with-http_random_index_module
#啟用 ngx_http_secure_link_module 支持(計算和檢查要求所需的安全鏈接網址)
--with-http_secure_link_module
#啟用 ngx_http_degradation_module 支持(允許在內存不足的情況下返回204或444碼)
--with-http_degradation_module
#啟用ngx_http_slice_module模塊(1.9.8), 提供一個過濾器,用于將請求分為多個子請求,每個子請求都返回一定范圍的響應
--with-http_slice_module
#啟用 ngx_http_stub_status_module 支持(獲取 Nginx 自上次啟動以來的工作狀態)
--with-http_stub_status_module
#禁用 ngx_http_charset_module 支持(重新編碼 WEB 頁面,但只能是一個方向--服務器端到客戶端,并且只有一個字節的編碼可以被重 新編碼)
--without-http_charset_module
#禁用 ngx_http_gzip_module 支持(該模塊同 --with-http_gzip_static_module 功能一樣)
--without-http_gzip_module
#禁用 ngx_http_ssi_module 支持(該模塊提供了一個在輸入端處理處理服務器包含文件(SSI)的過濾器,目前支持 SSI 命令的列表是不完整的)
--without-http_ssi_module
#禁用 ngx_http_userid_module 支持(該模塊用來處理用來確定客戶端后續請求的 cookie )
--without-http_userid_module
#禁用 ngx_http_access_module 支持(該模塊提供了一個簡單的基于主機的訪問控制。允許/拒絕基于 IP 地址)
--without-http_access_module
#禁用 ngx_http_auth_basic_module(該模塊是可以使用用戶名和密碼基于 HTTP 基本認證方法來保護你的站點或其部分內容)
--without-http_auth_basic_module
#禁用 ngx_http_autoindex_module支持(該模塊用于自動生成目錄列表,只在 ngx_http_index_module 模塊未找到索引文件時發出請求)
--without-http_autoindex_module
#禁用 ngx_http_geo_module 支持(創建一些變量,其值依賴于客戶端的IP地址)
--without-http_geo_module
#禁用 ngx_http_map_module 支持(使用任意的鍵/值對設置配置變量)
--without-http_map_module
#禁用 ngx_http_split_clients_module 支持(該模塊用來基于某些條件劃分用戶。條件如:ip地址、報頭、cookies等等)
--without-http_split_clients_module
#禁用 ngx_http_referer_module支持(該模塊用來過濾請求,拒絕報頭中 Referer 值不正確的請求)
--without-http_referer_module
#禁用 ngx_http_rewrite_module ,鏈接重寫
--without-http_rewrite_module
#禁用 ngx_http_proxy_module 支持(有關代理服務器)
--without-http_proxy_module
#禁用 ngx_http_fastcgi_module 支持(該模塊允許 Nginx 與 FastCGI 進程交互,并通過傳遞參數來控制 FastCGI 進程工作。 )FastCGI 一個常駐型的公共網關接口
--without-http_fastcgi_module
#禁用 ngx_http_uwsgi_module 支持(該模塊用來醫用uwsgi協議,uWSGI服務器相關)
--without-http_uwsgi_module
#禁用 ngx_http_scgi_module支持
--without-http_scgi_module
#禁用 ngx_http_memcached_module 支持(該模塊用來提供簡單的緩存,以提高系統效率)
--without-http_memcached_module
##禁用ngx_http_limit_conn_module模塊,該模塊用于限制每個定義的鍵的連接數,特別是來自單個 IP 地址的連接數
--without-http_limit_conn_module
#禁用 ngx_http_limit_req_module 支持(該模塊允許你對于一個地址進行請求數量的限制用一個給定的session或一個特定的事件)
--without-http_limit_req_module
#禁用 ngx_http_empty_gif_module 支持(該模塊在內存中常駐了一個1*1的透明GIF圖像,可以被非常快速的調用)
--without-http_empty_gif_module
#禁用 ngx_http_browser_module 支持
--without-http_browser_module
#禁用ngx_http_upstream_hash_module,該模塊支持普通的hash及一致性hash兩種負載均衡算法,默認的是普通的hash來進行負載均衡。
--without-http_upstream_hash_module
#禁用 ngx_http_upstream_ip_hash_module 支持(該模塊用于簡單的負載均衡)
--without-http_upstream_ip_hash_module
#禁用ngx_http_upstream_least_conn_module用于將多個服務器?定義成服務器?組,?由 proxy_pass,fastcgi_pass 等指令進?引
--without-http_upstream_least_conn_module
#禁用http_upstream_keepalive_module模塊
--without-http_upstream_keepalive_module
#禁用ngx_http_upstream_zone_module模塊 該模塊使用共享內存使負載均衡策略對所有worker進程生效
--without-http_upstream_zone_module
#啟用 ngx_http_perl_module 支持(該模塊使nginx可以直接使用perl或通過ssi調用perl)
--with-http_perl_module
#設定 perl 模塊路徑
--with-perl_modules_path=PATH
#設定 perl 庫文件路徑
--with-perl=PATH
#設定 access log 路徑
--http-log-path=PATH
#設定 HTTP 客戶端請求臨時文件路徑
--http-client-body-temp-path=PATH
#設定 HTTP 代理臨時文件路徑
--http-proxy-temp-path=PATH
#設定 HTTP Fastcgi 臨時文件路徑
--http-fastcgi-temp-path=PATH
#設定 HTTP uwsgi 臨時文件路徑
--http-uwsgi-temp-path=PATH
#設定 HTTP scgi 臨時文件路徑
--http-scgi-temp-path=PATH
#禁用 HTTP server 功能
--without-http
#禁用 HTTP Cache 功能
--without-http-cache
#啟用 POP3/IMAP4/SMTP 代理模塊支持
--with-mail
#啟用 ngx_mail_ssl_module 支持
--with-mail_ssl_module
#禁用 POP3 協議
--without-mail_pop3_module
#禁用 IMAP 協議
--without-mail_imap_module
#禁用 SMTP 協議
--without-mail_smtp_module
#啟用tcp代理支持
--with-stream
#啟用ngx_stream_ssl_module模塊,用于流代理服務器與SSL / TLS協議工作必要的支持
--with-stream_ssl_module
#啟用ngx_http_limit_conn_module模塊 能夠配置并發連接數限制
--without-stream_limit_conn_module
#禁用ngx_stream_access_module
#禁用ngx_stream_access_module模塊(1.9.2),該模塊允許對某些客戶端地址限制訪問
--without-stream_access_module
#禁用ngx_stream_upstream_hash_module模塊
--without-stream_upstream_hash_module
#禁用ngx_stream_upstream_least_conn_module模塊
--without-stream_upstream_least_conn_module
#禁用ngx_stream_upstream_zone_module模塊,共享內存使用的單鏈表模塊
--without-stream_upstream_zone_module
#啟用 ngx_google_perftools_module支持(調試用,剖析程序性能瓶頸)
--with-google_perftools_module
#啟用 ngx_cpp_test_module 支持
--with-cpp_test_module
#添加新的模塊
--add-module=PATH
#指向 C 編譯器路徑
--with-cc=PATH
#指向 C 預處理路徑
--with-cpp=PATH
#設置 C 編譯器參數
--with-cc-opt=OPTIONS
#設置連接文件參數
--with-ld-opt=OPTIONS
#指定編譯的 CPU,可用的值為:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
--with-cpu-opt=CPU
#禁用 PCRE 庫
--without-pcre
#啟用 PCRE 庫
--with-pcre
#指向 PCRE 庫文件目錄
--with-pcre=DIR
#在編譯時為 PCRE 庫設置附加參數
--with-pcre-opt=OPTIONS
# 配置參數啟用 JIT 支持 PCRE JIT 可以明顯加快正則表達式的處理速度。
--with-pcre-jit
#指向 MD5 庫文件目錄(消息摘要算法第五版,用以提供消息的完整性保護)
--with-md5=DIR
#在編譯時為 MD5 庫設置附加參數
--with-md5-opt=OPTIONS
#使用 MD5 匯編源
--with-md5-asm
#指向 sha1 庫目錄(數字簽名算法,主要用于數字簽名)
--with-sha1=DIR
#在編譯時為 sha1 庫設置附加參數
--with-sha1-opt=OPTIONS
#使用 sha1 匯編源
--with-sha1-asm
#指向 zlib 庫目錄
--with-zlib=DIR
#在編譯時為 zlib 設置附加參數
--with-zlib-opt=OPTIONS
#為指定的 CPU 使用 zlib 匯編源進行優化,CPU 類型為 pentium, pentiumpro
--with-zlib-asm=CPU
#為原子內存的更新操作的實現提供一個架構
--with-libatomic
#指向 libatomic_ops 安裝目錄
--with-libatomic=DIR
#指向 openssl 安裝目錄
--with-openssl=DIR
#在編譯時為 openssl 設置附加參數
--with-openssl-opt=OPTIONS
#啟用 debug 日志
--with-debug
上面列出了configure支持的全部參數,其中:
例如:./configure --with-libatomic
例如:./configure without-mail_pop3_module
下面開始使用configure命令對nginx進行安裝, 不帶任何參數均使用默認配置。
[root@iZbp128dczen7roibd3xciZ nginx-1.9.9]# ./configure
checking for OS
+ Linux 3.10.0-957.1.3.el7.x86_64 x86_64
checking for C compiler ... found
+ using GNU C compiler
+ gcc version: 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
checking for gcc -pipe switch ... found
checking for gcc builtin atomic operations ... found
checking for C99 variadic macros ... found
checking for gcc variadic macros ... found
checking for unistd.h ... found
checking for inttypes.h ... found
checking for limits.h ... found
checking for sys/filio.h ... not found
checking for sys/param.h ... found
checking for sys/mount.h ... found
checking for sys/statvfs.h ... found
checking for crypt.h ... found
checking for Linux specific features
checking for epoll ... found
checking for EPOLLRDHUP ... found
checking for O_PATH ... found
checking for sendfile() ... found
checking for sendfile64() ... found
checking for sys/prctl.h ... found
checking for prctl(PR_SET_DUMPABLE) ... found
checking for sched_setaffinity() ... found
checking for crypt_r() ... found
checking for sys/vfs.h ... found
checking for nobody group ... found
checking for poll() ... found
checking for /dev/poll ... not found
checking for kqueue ... not found
checking for crypt() ... not found
checking for crypt() in libcrypt ... found
checking for F_READAHEAD ... not found
checking for posix_fadvise() ... found
checking for O_DIRECT ... found
checking for F_NOCACHE ... not found
checking for directio() ... not found
checking for statfs() ... found
checking for statvfs() ... found
checking for dlopen() ... not found
checking for dlopen() in libdl ... found
checking for sched_yield() ... found
checking for SO_SETFIB ... not found
checking for SO_REUSEPORT ... found
checking for SO_ACCEPTFILTER ... not found
checking for TCP_DEFER_ACCEPT ... found
checking for TCP_KEEPIDLE ... found
checking for TCP_FASTOPEN ... found
checking for TCP_INFO ... found
checking for accept4() ... found
checking for eventfd() ... found
checking for int size ... 4 bytes
checking for long size ... 8 bytes
checking for long long size ... 8 bytes
checking for void * size ... 8 bytes
checking for uint64_t ... found
checking for sig_atomic_t ... found
checking for sig_atomic_t size ... 4 bytes
checking for socklen_t ... found
checking for in_addr_t ... found
checking for in_port_t ... found
checking for rlim_t ... found
checking for uintptr_t ... uintptr_t found
checking for system byte ordering ... little endian
checking for size_t size ... 8 bytes
checking for off_t size ... 8 bytes
checking for time_t size ... 8 bytes
checking for setproctitle() ... not found
checking for pread() ... found
checking for pwrite() ... found
checking for pwritev() ... found
checking for sys_nerr ... found
checking for localtime_r() ... found
checking for posix_memalign() ... found
checking for memalign() ... found
checking for mmap(MAP_ANON|MAP_SHARED) ... found
checking for mmap("/dev/zero", MAP_SHARED) ... found
checking for System V shared memory ... found
checking for POSIX semaphores ... not found
checking for POSIX semaphores in libpthread ... found
checking for struct msghdr.msg_control ... found
checking for ioctl(FIONBIO) ... found
checking for struct tm.tm_gmtoff ... found
checking for struct dirent.d_namlen ... not found
checking for struct dirent.d_type ... found
checking for sysconf(_SC_NPROCESSORS_ONLN) ... found
checking for openat(), fstatat() ... found
checking for getaddrinfo() ... found
checking for PCRE library ... found
checking for PCRE JIT support ... found
checking for md5 in system md library ... not found
checking for md5 in system md5 library ... not found
checking for md5 in system OpenSSL crypto library ... not found
checking for sha1 in system md library ... not found
checking for sha1 in system OpenSSL crypto library ... not found
checking for zlib library ... found
creating objs/Makefile
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using builtin md5 code
+ sha1 library is not found
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
上面編譯過程中有一些報錯小插曲, 問題可以參見本文最后的小節[遇到的問題]
執行完成后,沒有報錯代表安裝完成。在當前目錄下會生成一些目標文件:
和文章開頭部分的目錄截圖對比可以看出,多了objs、makefile這兩種文件,接下來我們進入編譯構建環節。
當 configure 配置完畢后,可以使用 make 命令執行編譯構建。這個過程會執行在 Makefile 文件中定義的一系列任務將軟件源代碼編譯成可執行文件。
make
我們下載的nginx源碼包一般沒有一個最終的 Makefile 文件,需要 configure 根據系統的參數生成一個定制化的 Makefile 文件。
在前面的步驟2中配置動作執行完成后,會根據當前系統環境生成Makefile腳本文件以及objs目錄。這兩個文件的用途會在接下來的文件目錄說明中進行解釋。
我們繼續在根目錄下執行make命令開始對源代碼進行編譯構建, 沒有報錯代表執行成功。
注意 如果是第一次安裝,可以跳過本步驟,執行下一個步驟make install命令,如果是升級,就只能執行make而不能執行make install命令。 小郭這里已經安裝過,因此只執行make命令即可
///.......
//......篇幅太長,略......
objs/src/http/modules/ngx_http_upstream_ip_hash_module.o \
objs/src/http/modules/ngx_http_upstream_least_conn_module.o \
objs/src/http/modules/ngx_http_upstream_keepalive_module.o \
objs/src/http/modules/ngx_http_upstream_zone_module.o \
objs/ngx_modules.o \
-lpthread -lcrypt -lpcre -lz
make[1]: Leaving directory `/home/guoyd/nginx-1.9.9'
make -f objs/Makefile manpage
make[1]: Entering directory `/home/guoyd/nginx-1.9.9'
sed -e "s|%%PREFIX%%|/usr/local/nginx|" \
-e "s|%%PID_PATH%%|/usr/local/nginx/logs/nginx.pid|" \
-e "s|%%CONF_PATH%%|/usr/local/nginx/conf/nginx.conf|" \
-e "s|%%ERROR_LOG_PATH%%|/usr/local/nginx/logs/error.log|" \
< man/nginx.8 > objs/nginx.8
make[1]: Leaving directory `/home/guoyd/nginx-1.9.9'
make命令執行完成后,需要把objs目錄下生成nginx二進制文件拷貝到原老版本的nginx目錄下。
//先備份原先的二進制文件(好習慣,所有人都值得記住)
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-default
// 將新的二進制文件拷貝到最終執行目錄下
cp /home/guoyd/nginx-1.9.9/objs/nginx /usr/local/nginx/sbin/
如果非第一次安裝,則必須跳過本步驟!
現在nginx軟件已經被構建好并且可以執行,接下來要做的就是將可執行文件復制到最終的路徑。make install 命令就是將可執行文件、第三方依賴包和文檔復制到正確的路徑。
make install
因為安裝這一步也是被定義在 Makefile 中,所以程序安裝的路徑可以通過 configure 命令的參數指定,或者 configure 通過系統參數決定。默認的nginx安裝路徑是/usr/local/nginx
如果要將可執行文件安裝在系統路徑,執行這步需要賦予相應的權限,一般是通過 sudo。
5)啟動
經過前面的步驟,nginx可執行程序已經成功安裝到服務器上了,默認安裝目錄是/usr/local/nginx, 接下來我們就執行對應的程序把nginx啟動即可
使用默認的配置文件進行啟動
可以把nginx可執行程序配置成系統環境變量,這樣就不需要指定全路徑了
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
6)訪問
訪問部署主機 IP,這時候就可以看到 Nginx 的歡迎頁面了~ Welcome to nginx!
至此,nginx 的安裝就大功告成啦!
nginx 的設計完全遵循模塊化設計思想,模塊化設計使得Nginx方便開發和擴展,功能很強大。
下面是Nginx`模塊架構圖:
這5個模塊由上到下重要性一次遞減。
(1)核心模塊
該模塊是nginx 最基本最核心的服務,如同操作系統的內核。它提供了基本功能像進程管理、權限控制、錯誤日志記錄等;
(2)標準HTTP模塊
標準HTTP模塊支持標準的HTTP的功能,如:端口配置,網頁編碼設置,HTTP響應頭設置等;
(3)可選HTTP模塊
可選HTTP模塊主要用于擴展標準的HTTP功能,讓Nginx能處理一些特殊的服務,如:解析GeoIP請求,SSL支持等;
(4)郵件服務模塊
郵件服務模塊主要用于支持Nginx的郵件服務;
(5)第三方模塊
第三方模塊是為了擴展Nginx服務器應用,完成開發者想要的功能,如:Lua支持,JSON支持等;
核心模塊是 Nginx 啟動的時候一定會加載的,其他的模塊,只有在解析配置的時候,遇到了這個模塊的命令,才會加載對應的模塊。
這個也是體現了 nginx 按需加載的理念。
nginx 擁有的模塊能力是在編譯的時候就確定了,也就是我們在安裝nginx時執行的./configure環節,該環節可以指定啟用或者禁用某些模塊,具體細節可以看文章開頭的安裝步驟介紹。
Nginx是經典的多進程模型,它啟動以后會以守護進程的方式在后臺運行,后臺進程包含一個master進程,和多個worker進程。請求進來后由master分發任務,worker負責執行或反向代理給具體的業務服務單元。
master進程只會有一個,worker進程的數量由配置項worker_processes指定,比如小郭的網站nginx配置:
worker_processes 1;
從上圖可以看出小郭的網站nginx只創建了一個master進程和一個worker進程。
這里使用了一種異步非阻塞機制,底層使用的epoll開發模型,簡單來說就是每個worker進程 使用 異步非阻塞方式 ,可以處理 多個客戶端請求 。
當某個worker進程 接收到客戶端的請求以后,調用 IO 進行處理,如果不能立即得到結果,就去 處理其他請求 (即為 非阻塞 );
而 客戶端 在此期間也 無需等待響應 ,可以去處理其他事情(即為異步)。當 IO 返回時,就會通知此 worker進程 ,該進程得到通知,暫時掛起 當前處理的事務去 響應客戶端請求 。
master進程和worker進程各司其職:
worker進程基于事件驅動的異步非阻塞模式處理請求,這種模式大大提高了worker進程處理請求的速度。為了盡可能的提高性能,nginx對每個worker進程設置了CPU的親和性,盡量把worker進程綁定在指定的CPU上執行,以減少上下文切換帶來的開銷。
這里值得一提的是nginx的配置文件熱更新原理 ,我們修改配置文件然后使用命令‘nginx -s reload’ 使之生效,其實正是依賴這個多進程模型才得以實現。
在多進程模型機制下,當一個worker搶到請求時,它會去轉發(反向代理)給后面的業務服務器(比如tomcat),讓其去處理并返回。在這個過程中,我們能夠使用上述的熱部署命令加載nginx,是因為其它沒搶到的worker會去熱加載配置,使最新的配置生效,而正在執行請求的worker正在工作中(因為搶到請求,需要先處理完),等待其處理請求完成之后也會去熱加載配置。這么做可以在不影響當前進行中請求的情況下去更新nginx的配置。也就是“無縫熱部署”。
最大并發數指的就是當前所有的worker進程加起來最多可以同時處理多少個請求。也就是所有worker的連接數之和(worker個數*worker支持的最大連接數),但其中因為動靜請求的問題會有來回,損耗了連接數。所以所有worker的連接數還需根據請求的類別除以2或4.。
假如nginx 有一個 master,有4個 woker,每個 woker 支持最大的連接數 1024,支持的最大并發數是多少?
這個問題需要區分動態資源請求和靜態資源請求:
最大并發數=worker個數(4)*worker支持的最大連接數(1024)/ 所消耗的連接數(4)=1024
最大并發數=worker個數(4)*worker支持的最大連接數(1024)/ 所消耗的連接數(2)=2048
基于前面的多進程模型,當客戶端請求進來后,nginx會去通知名下空閑的worker進程(如果沒有空閑中的worker進程且當前worker進程數量沒有超出配置個數限制,則會讓master進程來創建一個worker進程),告訴它們有新的請求啦。然后這些worker會去爭搶,誰搶到這個請求就算誰的。搶到之后,由于nginx不能直接處理動態資源(比如java服務業務邏輯)的要求,需要動態資源的業務服務器來做處理,所以這個時候搶到請求的worker會反向代理給后面的業務服務器執行,最后拿到執行結果返回給客戶端。
上圖展示了一個請求的基本執行主流程: 首先用戶通過http/https協議訪問nginx的主機,nginx通過worker線程來處理客戶端的請求,若用戶請求網站服務,worker就會到web server這個服務集群提取對應的資源給客戶端,同理,這個Application server可以用來訪問應用服務器,Memcached緩存服務器,backup是后端的意思。
Nginx的靜態處理能力很強,但是動態處理能力不足,因此,在企業中常用動靜分離技術。動靜分離技術其實是采用代理的方式,在server{}段中加入帶正則匹配的location來指定匹配項針對PHP的動靜分離:靜態頁面交給Nginx處理,動態頁面交給PHP-FPM模塊或Apache處理。在Nginx的配置中,是通過location配置段配合正則匹配實現靜態與動態頁面的不同處理方式。
靜態服務器是Nginx的強項,使用非常容易,在默認配置下本身就是指向了靜態的HTML界面,比如小郭的個人博客網站源代碼其實都是一些靜態的文章頁面資源,直接放在nginx服務器上的指定目錄,通過nginx對外提供直接訪問的。
再看看下面是一個動態和靜態服務都存在的配置方式:
//動態服務器資源群組
upstream server_pools {
server 192.168.1.189:80 ;
}
server {
listen 80;
server_name www_server_pool;
location / {
proxy_pass http://server_pools; //動態資源
include proxy.conf;
}
location /static/ {
root html/dist; //靜態資源
index index.html index.htm;
}
}
負載均衡(Load Balance)的意思就是將客戶端請求按某種分配算法分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。負載均衡的目的是提升吞吐率, 提升請求性能, 實現高容災。
通俗的解釋:現有的請求使服務器壓力太大無法承受,所以需要搭建一個服務器集群,去分擔原先單個服務器所承受的壓力,那現在我們有多臺服務器,我們想把請求分攤給這些服務器,但是服務器可能資源配置不同,能承受的壓力也不同,所以怎么分?如何分配更好?又是一個問題。
Nginx實現負載均衡功能是依賴 proxy_pass 代理模塊和upstream負載均衡模塊, 將客戶端請求代理轉發至一組 upstream 虛擬服務池。
負載均衡模塊 | 模塊說明 |
ngx_http_proxy_module | proxy代理模塊,用于把請求后拋給服務器節點或upstream服務器池。 |
ngx_http_upstream_module | 負載均衡模塊,可以實現網站的負載均衡功能及節點的健康檢查。 |
打開Nginx配置文件nginx.con,在http模塊內server模塊外添加upstream配置, 然后在server模塊內添加proxy_pass配置
upstream是關鍵字必須要有,后面的node為一個upstream集群組的名字,可以自定義, 需要和proxy_pass節點的配置保持一致即可
//動態服務器群組
upstream node {
server 192.168.10.11:8081;
server 192.168.10.12:8081;
server 192.168.10.13:8081;
//....無限個
}
server {
server_name localhost;
listen 80;
location / {
proxy_pass http://node;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
通過上面的配置,就實現了192.168.10.11、192.168.10.12、192.168.10.13這三臺服務器的請求分發了, 使用的是默認的負載均衡算法-輪詢法。
upstream模塊還支持很多參數,下面也簡單記錄下。
狀態 | 概述 |
down | 當前的server暫不參與負載均衡 |
backup | 預留的備份服務器,當其他服務器都掛掉的時候,啟用 |
max_fails | 允許請求失敗的次數 ,如果請求失敗次數超過限制,則進過fail_timeout 時間后從虛擬服務池中kill掉該服務器 |
fail_timeout | 經過max_fails失敗后,服務暫停時間,max_fails設置后,必須設置fail_timeout 值 |
max_conns | 限制最大的連接數,用于服務器硬件配置不同的情況下 |
例如我想讓192.168.10.11這臺服務器不參與負載均衡,192.168.10.12這臺服務器當成預留的備用機器,192.168.10.13這太服務器允許請求失敗1次,則可以按如下方式配置:
//動態服務器群組
upstream node {
server 192.168.10.11:8081 down; //暫不參與負載均衡
server 192.168.10.12:8081 backup;//預留的備份服務器,當其他服務器都掛掉的時候,啟用
server 192.168.10.13:8081 max_fails=1fail_timeout=10s;//允許請求失敗1次,請求失敗1次后服務器暫停服務10秒
//....無限個
}
除了輪詢和weight輪詢權重外,都是Nginx根據不同的算法實現的。在實際運用中,需要根據不同的場景選擇性運用,大都是多種策略結合使用以達到實際需求。
策略算法 | 作用 |
輪詢 | 逐一輪詢,默認方式 。如果服務器down掉了,會自動剔除該服務器。此策略適合服務器配置相當,無狀態且短平快的服務使用。業務無特殊要求時使用。 也適用于圖片服務器集群和純靜態頁面服務器集群 |
weight | 在輪詢策略的基礎上指定輪詢的幾率, 加權輪詢,weight越大,分配的幾率越高。此策略可以與least_conn和ip_hash結合使用。適用業務場景:用于后端服務器硬件性處理能力不平均的情形。 |
ip_hash | 按照訪問IP的hash結果分配,會導致來自同一IP的請求訪問固定的一個后臺服務器,適合需要狀態保持的服務,例如需要賬號登錄的系統,會話連接保持的業務。 |
url_hash | 按照訪問URL的hash結果分配(需編譯安裝第三方模塊 ngx_http_upstream_hash_module)適用于后端服務器為緩存服務器時比較有效。 |
least_conn | 最少鏈接數,那個服務器鏈接數少就會給分配 。適合請求處理時間長短不一造成服務器過載的業務場景。 |
fair | 按后端服務器的響應時間來分配請求,響應時間短的優先分配。 適合對訪問響應速度有一定要求的業務(需編譯安裝第三方模塊 ngx_http_upstream_fair_module) |
weight配置示例:
在該例子中,weight參數用于在默認的輪詢算法基礎上指定輪詢幾率,weight的默認值為1;weight的數值與訪問比率成正比,比如jdk 8.0的機器被訪問的幾率為其他服務器的兩倍。
此策略比較適合服務器的硬件配置差別比較大的情況。
#動態服務器組
upstream dynamic_server {
server localhost:8080 weight=2; #jdk 8
server localhost:8081; #jdk 17
server localhost:8082 backup; #jdk 16
server localhost:8083 max_fails=3 fail_timeout=20s; #jdk 15
}
ip_hash配置示例:
注意:
在nginx版本1.3.1之前,不能在ip_hash中使用權重(weight)。
ip_hash不能與backup同時使用。
此策略適合有狀態服務,比如session。當有服務器需要剔除,必須手動down掉。
#動態服務器組
upstream dynamic_server {
ip_hash; #保證每個訪客固定訪問一個后端服務器
server localhost:8080 weight=2; #jdk 8
server localhost:8081; #jdk 17
server localhost:8082 backup; #jdk 16
server localhost:8083 max_fails=3 fail_timeout=20s; #jdk 15
}
url_hash配置示例:
按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,要配合緩存命中來使用
#動態服務器組
upstream dynamic_server {
hash $request_uri; #實現每個url定向到同一個后端服務器
server localhost:8080;
server localhost:8081;
server localhost:8082;; max_fails=3 fail_timeout=20s; #jdk 15
}
least_conn配置示例:
有些請求占用的時間很長,會導致其所在的后端負載較高。這種情況下,least_conn這種方式就可以達到更好的負載均衡效果
#動態服務器組
upstream dynamic_server {
least_conn; #把請求轉發給連接數較少的后端服務器
server localhost:8080 weight=2; #jdk 8
server localhost:8081; #jdk 17
server localhost:8082 backup; #jdk 16
server localhost:8083 max_fails=3 fail_timeout=20s; #jdk 15
}
fair配置示例:
特點:按后端服務器的響應時間來分配請求,響應時間短的優先分配。
適用業務場景:對訪問響應速度有一定要求的業務
#動態服務器組
upstream dynamic_server {
fair; #把請求轉發給連接數較少的后端服務器
server localhost:8080;
server localhost:8081;
server localhost:8082;
server localhost:8083 max_fails=3 fail_timeout=20s;
}
展示的是從官網下載下來的原始代碼壓縮包,通過命令tar -xvf nginx.1.9.9.tar.gz 解壓出來的文件目錄(未編譯前的原始目錄)
[root@xxx nginx-1.9.9]# pwd
/home/guoyd/nginx-1.9.9
[root@xxx nginx-1.9.9]# ll
total 672
drwxr-xr-x 6 1001 1001 4096 Sep 19 14:34 auto
-rw-r--r-- 1 1001 1001 256752 Dec 9 2015 CHANGES
-rw-r--r-- 1 1001 1001 390572 Dec 9 2015 CHANGES.ru
drwxr-xr-x 2 1001 1001 4096 Sep 19 14:34 conf
-rwxr-xr-x 1 1001 1001 2481 Dec 9 2015 configure
drwxr-xr-x 4 1001 1001 4096 Sep 19 14:34 contrib
drwxr-xr-x 2 1001 1001 4096 Sep 19 14:34 html
-rw-r--r-- 1 1001 1001 1397 Dec 9 2015 LICENSE
drwxr-xr-x 2 1001 1001 4096 Sep 19 14:34 man
-rw-r--r-- 1 1001 1001 49 Dec 9 2015 README
drwxr-xr-x 9 1001 1001 4096 Sep 19 14:34 src
展示的是在源代碼根目錄下執行./configure命令執行配置后的目錄結構
[root@xxx nginx-1.9.9]# pwd
/home/guoyd/nginx-1.9.9
[root@xxx nginx-1.9.9]# ll
total 680
drwxr-xr-x 6 1001 1001 4096 Sep 19 14:34 auto
-rw-r--r-- 1 1001 1001 256752 Dec 9 2015 CHANGES
-rw-r--r-- 1 1001 1001 390572 Dec 9 2015 CHANGES.ru
drwxr-xr-x 2 1001 1001 4096 Sep 19 14:34 conf
-rwxr-xr-x 1 1001 1001 2481 Dec 9 2015 configure
drwxr-xr-x 4 1001 1001 4096 Sep 19 14:34 contrib
drwxr-xr-x 2 1001 1001 4096 Sep 19 14:34 html
-rw-r--r-- 1 1001 1001 1397 Dec 9 2015 LICENSE
-rw-r--r-- 1 root root 366 Sep 19 14:39 Makefile # 編譯后產生的文件
drwxr-xr-x 2 1001 1001 4096 Sep 19 14:34 man
drwxr-xr-x 3 root root 4096 Sep 19 14:39 objs # 編譯后產生的文件
-rw-r--r-- 1 1001 1001 49 Dec 9 2015 README
drwxr-xr-x 9 1001 1001 4096 Sep 19 14:34 src
[root@xxx objs]# ls
autoconf.err Makefile ngx_auto_config.h ngx_auto_headers.h ngx_modules.c src
[root@xxx objs]#
和原始源代碼目錄對比可以看出,只是新增了Makefile、objs這兩類文件信息:
[root@xxx nginx-1.9.9]# pwd
/home/guoyd/nginx-1.9.9
[root@xxx nginx-1.9.9]# ll
total 680
drwxr-xr-x 6 1001 1001 4096 Sep 19 14:34 auto
-rw-r--r-- 1 1001 1001 256752 Dec 9 2015 CHANGES
-rw-r--r-- 1 1001 1001 390572 Dec 9 2015 CHANGES.ru
drwxr-xr-x 2 1001 1001 4096 Sep 19 14:34 conf
-rwxr-xr-x 1 1001 1001 2481 Dec 9 2015 configure
drwxr-xr-x 4 1001 1001 4096 Sep 19 14:34 contrib
drwxr-xr-x 2 1001 1001 4096 Sep 19 14:34 html
-rw-r--r-- 1 1001 1001 1397 Dec 9 2015 LICENSE
-rw-r--r-- 1 root root 366 Sep 19 14:39 Makefile
drwxr-xr-x 2 1001 1001 4096 Sep 19 14:34 man
drwxr-xr-x 3 root root 4096 Sep 19 14:51 objs
-rw-r--r-- 1 1001 1001 49 Dec 9 2015 README
drwxr-xr-x 9 1001 1001 4096 Sep 19 14:34 src
[root@xxx nginx-1.9.9]# cd objs/
[root@xxx objs]# ls
autoconf.err Makefile nginx nginx.8 ngx_auto_config.h ngx_auto_headers.h ngx_modules.c ngx_modules.o src
[root@xxx objs]#
和上一步的目錄對比,可以看出僅objs目錄下新生成了nginx、nginx.8、ngx_modules.o這三個文件
是我們操作nginx程序的可執行程序 比如執行 nginx -t、nginx -s reload等命令
假如服務器上已經安裝過nginx,安裝目錄是/usr/local/nginx/,本次只是對nginx做版本更新,則只需要把這個執行程序拷貝到/usr/local/nginx/sbin目錄下即可完成升級操作(覆蓋原先的nginx可執行文件)
這個文件小郭沒搞懂是干嘛的,反正暫時用不到。。 有知道的大佬可以評論區告知一下。
沒搞懂用途,同nginx.8 /(ㄒoㄒ)/~~
4)編譯后安裝目錄
如果是第一次安裝,則需要執行make install命令直接將程序安裝到本機指定路徑(默認安裝到/usr/local/nginx,可以通過配置文件修改)
下面是安裝后的目錄
后續所有針對nginx的日常運維操作都是基于這個目錄了哦, 除非是升級和擴展功能模塊,否則和源代碼目錄就沒啥關系了
[root@XXX nginx]# pwd
/usr/local/nginx
[root@XXX nginx]# ll
total 36
drwx------ 2 root root 4096 Jan 19 2019 client_body_temp
drwxr-xr-x 2 root root 4096 Sep 19 09:59 conf
drwx------ 2 root root 4096 Jan 19 2019 fastcgi_temp
drwxr-xr-x 3 root root 4096 Sep 18 20:38 html
drwxr-xr-x 2 root root 4096 Jun 12 22:23 logs
drwx------ 12 root root 4096 Jan 31 2019 proxy_temp
drwxr-xr-x 2 root root 4096 Sep 18 10:10 sbin
drwx------ 2 root root 4096 Jan 19 2019 scgi_temp
drwx------ 2 root root 4096 Jan 19 2019 uwsgi_temp
/etc/nginx/nginx.conf是Nginx 的主配置文件,可以使用 cat -n nginx.conf 來查看配置,也可以使用./nginx -T 查看當前生效中的配置。
nginx.conf 結構圖可以這樣概括:
main # 全局配置,對全局生效
├── events # 配置影響 Nginx 服務器或與用戶的網絡連接
├── http # 配置代理,緩存,日志定義等絕大多數功能和第三方模塊的配置
│ ├── upstream # 配置后端服務器具體地址,負載均衡配置不可或缺的部分
│ ├── server # 配置虛擬主機的相關參數,一個 http 塊中可以有多個 server 塊
│ ├── server
│ │ ├── location # server 塊可以包含多個 location 塊,location 指令用于匹配 uri
│ │ ├── location
│ │ └── ...
│ └── ...
└── ...
一個 Nginx 配置文件的結構就像 nginx.conf 顯示的那樣,配置文件的語法規則:
小郭的博客網站nginx的配置文件是下面這樣的(業務比較簡單,沒有涉及過多自定義配置項):
user root; #運行用戶
worker_processes 1;#Nginx 進程數,一般設置為和 CPU 核數一樣
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/dist;
index index.html index.htm;
}
}
}
下面記錄下全量的配置說明,方便日后查閱:
信息來源于網絡,僅供參考,最終要以nginx官網更新為準哦
# 運行用戶
user www-data;
# 啟動進程,通常設置成和cpu的數量相等
worker_processes 6;
# 全局錯誤日志定義類型,[debug | info | notice | warn | error | crit]
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
# 進程pid文件
pid /var/run/nginx.pid;
# 工作模式及連接數上限
events {
# 僅用于linux2.6以上內核,可以大大提高nginx的性能
use epoll;
# 單個后臺worker process進程的最大并發鏈接數
worker_connections 1024;
# 客戶端請求頭部的緩沖區大小
client_header_buffer_size 4k;
# keepalive 超時時間
keepalive_timeout 60;
# 告訴nginx收到一個新連接通知后接受盡可能多的連接
# multi_accept on;
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
# 文件擴展名與文件類型映射表義
include /etc/nginx/mime.types;
# 默認文件類型
default_type application/octet-stream;
# 默認編碼
charset utf-8;
# 服務器名字的hash表大小
server_names_hash_bucket_size 128;
# 客戶端請求頭部的緩沖區大小
client_header_buffer_size 32k;
# 客戶請求頭緩沖大小
large_client_header_buffers 4 64k;
# 設定通過nginx上傳文件的大小
client_max_body_size 8m;
# 開啟目錄列表訪問,合適下載服務器,默認關閉。
autoindex on;
# sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對于普通應用,
# 必須設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為 off,以平衡磁盤與網絡I/O處理速度
sendfile on;
# 此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
#tcp_nopush on;
# 連接超時時間(單秒為秒)
keepalive_timeout 65;
# gzip模塊設置
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #最小壓縮文件大小
gzip_buffers 4 16k; #壓縮緩沖區
gzip_http_version 1.0; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
# 開啟限制IP連接數的時候需要使用
#limit_zone crawler $binary_remote_addr 10m;
# 指定虛擬主機的配置文件,方便管理
include /etc/nginx/conf.d/*.conf;
# 負載均衡配置
upstream mysvr {
# 請見上文中的五種配置
}
# 虛擬主機的配置
server {
# 監聽端口
listen 80;
# 域名可以有多個,用空格隔開
server_name www.jd.com jd.com;
# 默認入口文件名稱
index index.html index.htm index.php;
root /data/www/jd;
# 圖片緩存時間設置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${
expires 10d;
}
#JS和CSS緩存時間設置
location ~ .*.(js|css)?${
expires 1h;
}
# 日志格式設定
#$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
#$remote_user:用來記錄客戶端用戶名稱;
#$time_local: 用來記錄訪問時間與時區;
#$request: 用來記錄請求的url與http協議;
#$status: 用來記錄請求狀態;成功是200,
#$body_bytes_sent :記錄發送給客戶端文件主體內容大小;
#$http_referer:用來記錄從那個頁面鏈接訪問過來的;
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
# 定義本虛擬主機的訪問日志
access_log /usr/local/nginx/logs/host.access.log main;
access_log /usr/local/nginx/logs/host.access.404.log log404;
# 對具體路由進行反向代理
location /connect-controller {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
# 后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
# 允許客戶端請求的最大單文件字節數
client_max_body_size 10m;
# 緩沖區代理緩沖用戶端請求的最大字節數,
client_body_buffer_size 128k;
# 表示使nginx阻止HTTP應答代碼為400或者更高的應答。
proxy_intercept_errors on;
# nginx跟后端服務器連接超時時間(代理連接超時)
proxy_connect_timeout 90;
# 后端服務器數據回傳時間_就是在規定時間之內后端服務器必須傳完所有的數據
proxy_send_timeout 90;
# 連接成功后,后端服務器響應的超時時間
proxy_read_timeout 90;
# 設置代理服務器(nginx)保存用戶頭信息的緩沖區大小
proxy_buffer_size 4k;
# 設置用于讀取應答的緩沖區數目和大小,默認情況也為分頁大小,根據操作系統的不同可能是4k或者8k
proxy_buffers 4 32k;
# 高負荷下緩沖大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
# 設置在寫入proxy_temp_path時數據的大小,預防一個工作進程在傳遞文件時阻塞太長
# 設定緩存文件夾大小,大于這個值,將從upstream服務器傳
proxy_temp_file_write_size 64k;
}
# 動靜分離反向代理配置(多路由指向不同的服務端或界面)
location ~ .(jsp|jspx|do)?$ {
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://127.0.0.1:8080;
}
}
}
nginx -s reload # 向主進程發送信號,重新加載配置文件,熱重啟
nginx -s reopen # 重啟 Nginx
nginx -s stop # 快速關閉Nginx 可能并不保存相關信息
nginx -s quit # 等待工作進程處理完成后關閉,會保存相關信息 比stop更優雅
nginx -T # 查看當前 Nginx 最終的配置
nginx -t -c <配置路徑> # 檢查配置是否有問題,如果已經在配置目錄,則不需要-c
nginx -v #查看nginx版本
假如我們修改了nginx.conf文件,但是又不能重啟Nginx,就可以按如下步驟使配置文件動態更新:
[root@iZbp128dczen7roibd3xciZ sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@iZbp128dczen7roibd3xciZ sbin]# ./nginx -s reload
[root@iZbp128dczen7roibd3xciZ sbin]#
gzip on; # 默認off,是否開啟gzip
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# 上面兩個開啟基本就能跑起了,下面的愿意折騰就了解一下
gzip_static on;
gzip_proxied any;
gzip_vary on;
gzip_comp_level 6;
gzip_buffers 16 8k;
# gzip_min_length 1k;
若報錯,檢查nginx在configure環節是否關閉了ngx_http_gzip_module的功能模塊。
1)源碼編譯./configure:error: the HTTP rewrite module requires the PCRE library.
對nginx源碼使用"./configure"進行編譯時報錯:
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
大致意思是我的linux環境缺少了PCRE庫. 那就安裝一下吧:
//我的是centos系統
yum install pcre pcre-devel
Nginx的rewrite模塊和HTTP核心模塊會用到PCRE正則表達式語法)
2)源碼編譯./configure:error: the HTTP gzip module requires the zlib library.
對nginx源碼使用"./configure"進行編譯時報錯:
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.
大致意思是我的linux版本缺少了zlib庫. 那就再安裝一下吧:
//我的是centos系統
yum install zlib-devel
Nginx的gzip模塊會用到zlib支持
3)gzip開啟報錯:
unknown directive "gzip"
大致意思是不支持gzip指令,原因是我在編譯nginx源碼的時候,使用了參數--without-http_gzip_module, 未安裝gzip的功能模塊。
解決辦法如下:
默認會把gzip功能模塊開啟
本人Nginx首次安裝時,使用./configure --without-http_gzip_module跳過了gzip的配置和安裝,所以現在需要動態增加gzip壓縮模塊。
首先切換到Nginx源碼目錄,運行./configure命令。
cd /home/guoyd/nginx-1.9.9
./configure
配置完成后,執行make命令,但切記,不要執行make install命令。
make命令編譯完成后,將nginx執行文件復制到/usr/local/nginx/sbin/下(/usr/local/nginx/是Nginx的默認安裝目錄),復制之前,最好將nginx備份。
//先備份原先的二進制文件(好習慣,所有人都值得記住)
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-default
// 將新的二進制文件拷貝到最終執行目錄下
cp /home/guoyd/nginx-1.9.9/objs/nginx /usr/local/nginx/sbin/
通過上面的步驟,就可以成功將ngx_http_gzip_module模塊增加到已安裝的Nginx中。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。