文章目錄 1、前期準備 1.1 安裝gcc 1.2 安裝其他依賴包 1.3 下載安裝包 2、安裝nginx 2.1 解壓nginx 2.2 編譯安裝 2.3 啟動 2.4 常用命令 3、Nginx配置 use epoll 配置說明 log_format日志格式設置 nginx的upstream的幾種分配方式 1、輪詢(默認) 2、weight(加權輪詢) 3、ip_hash 4、fair(第三方) 5、url_hash(第三方)
1、前期準備
1.1 安裝gcc
首先檢查是否安裝了gcc
[root@hadoop-master test]
bash: gcc: 未找到命令
. . .
本機沒有安裝gcc,因此使用一下命令安裝gcc
[root@hadoop-master test]
安裝完成之后再檢查gcc版本
1.2 安裝其他依賴包
其他依賴包如下,我們一次安裝:pcre-devel、zlib-devel、openssl-devel
[root@hadoop-master test]
1.3 下載安裝包
可以在官網直接下載:http://nginx.org/download/ 也可以通過如下命令行進行下載
[root@hadoop-master test]
2、安裝nginx
2.1 解壓nginx
文中將nginx-1.9.9.tar.gz放在目錄:/usr/local 解壓nginx-1.9.9.tar.gz
[root@hadoop-master local]
[root@hadoop-master local]
2.2 編譯安裝
配置
[root@hadoop-master local]
[root@hadoop-master nginx-1.9.9]
編譯、安裝
[root@hadoop-master nginx-1.9.9]
[root@hadoop-master nginx-1.9.9]
檢查是否安裝成功
[root@hadoop-master nginx-1.9.9]
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
2.3 啟動
啟動我們的nginx
/ usr
/ local
/ nginx
/ sbin
/ nginx
訪問我們虛擬機的ip地址
http:
/ / 192
. 168
. 223
. 131
/
正常的情況是如下頁面: 如果訪問不了,大概率的情況還是防火墻沒開端口
[root@hadoop-master nginx-1.9.9]
no
將80端口加入到防火墻中
[root@hadoop-master nginx-1.9.9]
[root@hadoop-master nginx-1.9.9]
再次查看端口狀態
[root@hadoop-master nginx-1.9.9]
yes
至此,CentOS7下安裝nginx結束。
2.4 常用命令
我本地的nginx命令位置:/usr/local/nginx/sbin/nginx
啟動nginx,默認監聽80端口
nginx
啟動指定配置文件的nginx:
/ usr
/ local / nginx
/ sbin
/ nginx
- c
/ usr
/ local / nginx
/ conf
/ nginx
. conf
快速停止服務器:
nginx
- s stop
停止服務器,但要等到請求處理完畢后關閉:
nginx
- s quit
重新加載配置文件:
nginx
- s reload
指定配置文件重啟
/ usr
/ local / nginx
/ sbin
/ nginx
- s reload
- c
/ usr
/ local / nginx
/ conf
/ nginx
. conf
3、Nginx配置
配置文件位置/usr/local/nginx/conf/nginx.conf 配置文件結構如下:
配置內容省略
.. . events
{ 配置內容省略
.. .
} http
{ 配置內容省略
.. . server
{ 配置內容省略
.. . location
[ PATTERN
] { 配置內容省略
.. .
} location
[ PATTERN
] { 配置內容省略
.. .
} } server
{ 配置內容省略
.. .
} 配置內容省略
.. .
}
1、全局塊:配置影響nginx全局的指令 。一般有運行nginx配置器的用戶組,nginx進程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數等。 2、events塊:配置影響nginx服務器或與用戶的網絡連接 。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接收多個網絡連接,開啟多個網絡連接序列化等。 3、http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方模塊的配置 。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,但連接請求數等。 4、server塊:配置虛擬機主機的相關參數,一個http中可以有多個server 。 5、location:配置請求路由,以及各種頁面的處理情況 。
# 配置用戶及組,默認是nobody nobody
# user nobody
;
# 工作進程:數據。根據硬件調整,通常等于CPU數量或者
2 倍于CPU。
worker_processes
1 ; # 錯誤日志:日志路徑,級別。這個設置可以放入全局塊,http塊,server塊,級別以此為:debug
| info
| notice
| warn
| error
| crit
| alert
| emerg
# error_log logs
/ error
. log
;
# error_log logs
/ error
. log notice
;
error_log logs
/ error
. log info
; # pid ( 進程標識符
) :存放路徑。
pid logs
/ nginx
. pid
; # 指定進程可以打開的最大描述符:數目。這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit
- n)與nginx進程數相除,但是nginx分配請求并不是那么均勻,所以最好與ulimit
- n 的值保持一致。如果總并發量超過這個數據可能會返回
502 錯誤。
worker_rlimit_nofile
102400 ; events { accept_mutex on
; # 設置網路連接序列化,防止驚群現象發生,默認為on multi_accept on
; # 設置一個進程是否同時接受多個網絡連接,默認為off use epoll
; # 事件驅動模型,select
| poll
| kqueue
| epoll
| resig
| / dev
/ poll
| eventport worker_connections
102400 ; # 每個工作進程的最大連接數量。根據硬件調整,和前面工作進程配合起來用,盡量大,但是別把cpu跑到
100 % 就行。每個進程允許的最多連接數,理論上每臺nginx服務器的最大連接數為。
} http { include mime
. types
; # 文件或站名與文件類型映射表default_type application
/ octet
- stream
; # 默認文件類型,默認為text
/ plain
# access_log off
; # 取消服務日志log_format myFormat
'$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ; log_format log404
'$status [$time_local] $remote_addr $host$request_uri $sent_http_location' ; # 自定義格式
# 用了log_format指令設置了日志格式之后,需要用access_log指令指定日志文件的存放路徑
; access_log logs
/ access
. log myFormat
; # 用了log_format指令設置了日志格式之后,需要用access_log指令指定日志文件的存放路徑
; access_log logs
/ host
. access
. 404. log log404
; # 保存服務器名字的hash表是由指令server_names_hash_max_size和server_names_hash_bucket_size所控制的。
# 參數hash bucket size總是等于hash表的大小,并且是一路處理器緩存大小的倍數。
# 在減少了在內存中的存取次數后,使在處理器中加速查找hash表鍵值成為可能。
# 如果hash bucket size等于一路處理器緩存的大小,那么在查找鍵的時候,最壞的情況下在內存中查找的次數為
2 。
# 第一次是確定存儲單元的地址,第二次是在存儲單元中查找鍵值。
# 因此,如果Nginx給出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一個參數的大小
. server_names_hash_bucket_size
128 ; # 客戶端請求頭部的緩沖區大小。這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k,不過由于一般系統分頁都要大于1k,所以這里設置為分頁大小。分頁大小可以用命令getconf PAGESIZE取得。client_header_buffer_size 4k
; # 客戶請求頭緩沖大小。nginx默認會用client_header_buffer_size這個buffer來讀取header值,如果header過大,它會使用large_client_header_buffers來讀取。large_client_header_buffers
8 128k
; # 這個指令指定緩存是否啟用open_file_cache max
= 102400 inactive
= 20s
; open_file_cache_valid 30s
; # 語法
: open_file_cache_valid time 默認值
: open_file_cache_valid
60 使用字段
: http
, server
, location 這個指令指定了何時需要檢查open_file_cache中緩存項目的有效信息
. open_file_cache_min_uses
2 ; # 語法
: open_file_cache_min_uses number 默認值
: open_file_cache_min_uses
1 使用字段
: http
, server
, location 這個指令指定了在open_file_cache指令無效的參數中一定的時間范圍內可以使用的最小文件數
, 如果使用更大的值
, 文件描述符在cache中總是打開狀態
. open_file_cache_errors on
; # 語法
: open_file_cache_errors on
| off 默認值
: open_file_cache_errors off 使用字段
: http
, server
, location 這個指令指定是否在搜索一個文件是記錄cache錯誤
. # 設定通過nginx上傳文件的大小(如果上傳文件比較大可以修改這個值)client_max_body_size 300m
; # sendfile指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出文件,對于普通應用,必須設為on。
# 如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網絡IO處理速度,降低系統uptime。sendfile on
; # 此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用tcp_nopush on
; # 后端服務器連接的超時時間_發起握手等候響應超時時間proxy_connect_timeout
90 ; # 連接成功后_等候后端服務器響應時間_其實已經進入后端的排隊之中等候處理(也可以說是后端服務器處理請求的時間)proxy_read_timeout
180 ; # 后端服務器數據回傳時間_就是在規定時間之內后端服務器必須傳完所有的數據proxy_send_timeout
180 ; # 設置從被代理服務器讀取的第一部分應答的緩沖區大小,通常情況下這部分應答中包含一個小的應答頭,默認情況下這個值的大小為指令proxy_buffers中指定的一個緩沖區的大小,不過可以將其設置為更小proxy_buffer_size 256k
; # 設置用于讀取應答(來自被代理服務器)的緩沖區數目和大小,默認情況也為分頁大小,根據操作系統的不同可能是4k或者8kproxy_buffers
4 256k
; # 忙時buffer 的最大值。 一個客戶端一次只能從一個buffer 中讀取數據的同時,剩下的buffer 會被放到隊列中,等待發送到客戶端,這個directive 指定在這個狀態下的buffer 的大小proxy_busy_buffers_size 256k
; # 設置在寫入proxy_temp_path時數據的大小,預防一個工作進程在傳遞文件時阻塞太長proxy_temp_file_write_size 256k
; # proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區proxy_temp_path
/ usr
/ local / nginx
/ data0
/ proxy_temp_dir
; # 設置內存緩存空間大小為200MB,
1 天沒有被訪問的內容自動清除,硬盤緩存空間大小為10GB。proxy_cache_path
/ usr
/ local / nginx
/ data0
/ proxy_cache_dir levels
= 1 : 2 keys_zone
= cache_one
: 200m inactive
= 1d max_size
= 10g
; # keepalive超時時間keepalive_timeout
120 ; # 也是一個 socket 選項,啟用后會禁用 Nagle 算法,盡快發送數據,某些情況下可以節約 200ms
# (Nagle 算法原理是:在發出去的數據還未被確認之前,新生成的小數據先存起來,湊滿一個 MSS 或者等到收到確認后再發送)。
# Nginx 只會針對處于 keep
- alive 狀態的 TCP 連接才會啟用 tcp_nodelay。
# 可以看到 TCP_NOPUSH 是要等數據包累積到一定大小才發送,TCP_NODELAY 是要盡快發送,二者相互矛盾。實際上,它們確實可以一起用,最終的效果是先填滿包,再盡快發送。tcp_nodelay on
; # 如果把它設置為比較大的數值,例如256k,那么,無論使用firefox還是IE瀏覽器,來提交任意小于256k的圖片,都很正常。
# 如果注釋該指令,使用默認的client_body_buffer_size設置,也就是操作系統頁面大小的兩倍,8k或者16k,問題就出現了。
# 無論使用firefox4
. 0 還是IE8
. 0 ,提交一個比較大,200k左右的圖片,都返回
500 Internal Server Error錯誤client_body_buffer_size 512k
; # 我們在上線前,代碼(JS、CSS 和 HTML)會做壓縮,圖片也會做壓縮(PNGOUT、Pngcrush、JpegOptim、Gifsicle 等)。
# 對于文本文件,在服務端發送響應之前進行 GZip 壓縮也很重要,通常壓縮后的文本大小會減小到原來的
1 / 4 - 1 / 3 # gzip on
; # 表示使nginx阻止HTTP應答代碼為
400 或者更高的應答。proxy_intercept_errors on
; # nginx的upstream配置upstream
bakend { ip_hash
; server hadoop
- master
: 8001 ; server hadoop
- master
: 8002 ; server hadoop
- master
: 8003 ; } server { # 配置監聽端口listen
80 ; # 配置訪問域名server_name localhost
; # charset koi8
- r
; # access_log logs
/ host
. access
. log main
; location
/ { root html
; index index
. html index
. htm
; } # 這是個springboot項目
/ helloworld
- demo就是上下文路徑,指定
8001 ,
8002 ,
8003 三個端口啟動location
/ helloworld
- demo { proxy_pass http
: // bakend
; } # 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
; } # 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
; # } } # another virtual host using mix of IP
- , name
- , and port
- based configuration
# # server { # listen
8000 ; # listen somename
: 8080 ; # server_name somename alias another
. alias
; # location
/ { # root html
; # index index
. html index
. htm
; # } # } # HTTPS server
# # server { # listen
443 ssl
; # server_name localhost
; # ssl_certificate cert
. pem
; # ssl_certificate_key cert
. key
; # ssl_session_cache shared
: SSL
: 1m
; # ssl_session_timeout 5m
; # ssl_ciphers HIGH
: !aNULL
: !MD5
; # ssl_prefer_server_ciphers on
; # location
/ { # root html
; # index index
. html index
. htm
; # } # } }
use epoll 配置說明
使用epoll的I/O 模型。linux建議epoll,FreeBSD建議采用kqueue,window下不指定。 補充說明: 與apache相類,nginx針對不同的操作系統,有不同的事件模型 A)標準事件模型 Select、poll屬于標準事件模型,如果當前系統不存在更有效的方法,nginx會選擇select或poll B)高效事件模型 Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會造成內核崩潰。 Epoll:使用于Linux內核2.6版本及以后的系統。 /dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。 Eventport:使用于Solaris 10。 為了防止出現內核崩潰的問題, 有必要安裝安全補丁。
log_format日志格式設置
$remote_addr 與 $http_x_forwarded_for用以記錄客戶端的ip地址:
$remote_user: 用來記錄客戶端用戶名稱; $time_local: 用來記錄訪問時間與時區; $request: 用來記錄請求的url與http協議; $status: 用來記錄請求狀態;成功是200, $body_bytes_sent : 記錄發送給客戶端文件主體內容大小; $http_referer: 用來記錄從那個頁面鏈接訪問過來的; $http_user_agent: 記錄客戶瀏覽器的相關信息;
通常web服務器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務器的iP地址 。反向代理服務器在轉發請求的http頭信息中,可以增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。
nginx的upstream的幾種分配方式
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。
upstream
bakend { server
192.168 .0 .14 ; server
192.168 .0 .15 ;
}
2、weight(加權輪詢)
指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。 例如:
upstream
bakend { server
192.168 .0 .14 weight
= 10 ; server
192.168 .0 .15 weight
= 10 ;
}
3、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。 例如:
upstream
bakend { ip_hash
; server
192.168 .0 .14 : 88 ; server
192.168 .0 .15 : 80 ;
}
ip_hash使用的是ip地址前三位作為hash的key,如果是內網情況下會發現所有機器都映射到一臺機器,如果想實現內網的ip_hash參考《Nginx在局域網內實現真正的ip_hash負載均衡》
4、fair(第三方)
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream
backend { server server1
; server server2
; fair
;
}
5、url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。 例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法
upstream
backend { server squid1
: 3128 ; server squid2
: 3128 ; hash $request_uri
; hash_method crc32
;
}
注意:
upstream
bakend { # 定義負載均衡設備的Ip及設備狀態ip_hash
; server
127.0 .0 .1 : 9090 down
; server
127.0 .0 .1 : 8080 weight
= 2 ; server
127.0 .0 .1 : 6060 ; server
127.0 .0 .1 : 7070 backup
;
}
在需要使用負載均衡的server中增加:
proxy_pass http
: // bakend
/ ;
每個設備的狀態設置為:
down表示單前的server暫時不參與負載 weight為weight越大,負載的權重就越大。 max_fails:允許請求失敗的次數默認為1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤 fail_timeout:max_fails次失敗后,暫停的時間。 backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
nginx支持同時設置多組的負載均衡,用來給不用的server來使用。 client_body_in_file_only設置為On 可以講client post過來的數據記錄到文件中用來做debug client_body_temp_path設置記錄文件的目錄 可以設置最多3層目錄 location對URL進行匹配可以進行重定向或者進行新的代理 負載均衡
參考: 本博客 Nginx 配置之性能篇(https://imququ.com/post/my-nginx-conf-for-wpo.html)
總結
以上是生活随笔 為你收集整理的CentOS7下安装nginx1.99 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。