Nginx安裝配置
Nginx也是一款服務器,我們常用它做如:反向代理、負載均衡、動態與靜態資源的分離的工作,這裏就不過多介紹了,這篇博客介紹的十分詳細:Nginx相關介紹
跨平臺、配置簡單,非阻塞、高併發連接:處理2-3萬併發連接數,官方監測能支持5萬併發
Nginx優點
1、高併發連接
2、內存消耗少
3、配置文件非常簡單
4、成本低廉
5、支持Rewrite重寫規則
6、內置的健康檢查功能
7、節省帶寬
8、穩定性高
Nginx支持熱部署,幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啓動。能夠在不間斷服務的情況下,對軟件版本進行進行升級。Nginx的配置文件非常簡單,風格跟程序一樣通俗易懂,能夠支持perl語法。使用nginx –s reload可以在運行時加載配置文件,便於運行時擴容/減容。重新加載配置時,master進程發送命令給當前正在運行的worker進程worker進程接到命令後會在處理完當前任務後退出。同時,master進程會啓動新的worker進程來接管工作。
我這裏系統是centos,如果是其他系統命令會有些不同,流程是一樣的,當然用docker直接pull鏡像是很方便的,該配置就有些不同
1、在線安裝
yum install nginx
安裝好的文件位置如下:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放靜態文件
/var/log/nginx:存放日誌
通過這種方式安裝的,會自動創建服務,會自動在/etc/init.d/nginx新建服務腳本,然後就可以使用如下命令進行操作:
service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}
如果你想改它的配置文件地方,那麼就還是本地解壓安裝吧
-
離線安裝
注1:官網的步驟是通過命令行配置Nginx文件,將 openssl、pcre、zlib 一起編譯安裝的,但是這樣一旦出錯,不容易解決,所以最好單獨編譯安裝
注2:因爲後面使用第三方擴展模塊ngx_cache_purge,必須使用nginx的安裝源文件,而離線方式是不存在的,只有deb文件# 一、安裝nginx所需依賴庫 # 安裝gcc g++的依賴庫 yum install build-essential yum install libtool # 安裝pcre依賴庫 yum install libpcre3 libpcre3-dev # 安裝zlib依賴庫 yum install zlib1g-dev # 安裝SSL依賴庫(16.04默認已經安裝了,有些版本的linux是沒有安裝) yum install openssl # 二、下載並解壓安裝包 # 官方下載頁面:http://nginx.org/en/download.html # configure配置文件詳解:http://nginx.org/en/docs/configure.html # wget http://nginx.org/download/nginx-1.14.2.tar.gz cd /usr/local/mytools # 上傳並解壓離線安裝包 pscp d:/temp/nginx-1.14.2.tar.gz [email protected]:/usr/local/mytools tar -zxvf nginx-1.14.2.tar.gz # 三、安裝Nginx # 進入解壓目錄 cd nginx-1.14.2 # 配置:--prefix指定nginx的安裝路徑 ./configure --prefix=/usr/local/nginx # 編譯: make # 安裝 make install 注1:安裝好的文件位置如下: /usr/local/nginx/sbin/nginx:主程序 /usr/local/nginx/conf/nginx.conf:存放主配置文件 /usr/local/nginx/html:存放靜態文件 /usr/local/nginx/logs:存放日誌 # 啓動: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 注1:-c 指定配置文件的路徑,不加的話,nginx會自動加載默認路徑的配置文件。 注2:啓動成功後可將瀏覽器輸入http://服務器IP:80/即可看到nginx歡迎頁面 #查看進程: ps -ef | grep nginx # 四、創建Nginx自動啓動腳本 cd /etc/init.d # 進入/etc/init.d目錄 touch nginx # 創建腳本文件nginx,將資料“nginx配置方案及啓動腳本/nginx”文件中的內容複製進來 chmod a+x nginx # a+x 是給所有人加上可執行權限,包括所有者,所屬組,和其他人 chkconfig --add nginx chkconfig nginx on # 常用的命令如下 service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}
至於啓動配置文件,長了,自己去百度了,這裏就不發了
如果你配置不了自動啓動腳本,那麼就用原生態的就好了
開啓
/usr/local/nginx/sbin/nginx
重啓:
/usr/local/nginx/sbin/nginx -s reload
停止:
/usr/local/nginx/sbin/nginx -s stop
測試配置文件是否正常,這行命令是非常重要的,配置出錯就靠它來排查:
/usr/local/nginx/sbin/nginx -t
在下載環境的時候可能會報錯,如果是下列錯誤,那麼就解決了
nginx error: the HTTP rewrite module requires the PCRE library.
安裝pcre-devel解決問題
yum -y install pcre-devel
錯誤提示:./configure: error: the HTTP cache module requires md5 functions…
yum -y install openssl openssl-devel
然後我們這些配置好就通過 ip +80端口 能訪問我們的nginx了
配置負載均衡
這是我最後修改完畢的配置文件,並加上了註解以便理解
nginx的主配置文件結構
#定義Nginx運行的用戶和用戶組2
user root;
# nginx進程數,通常設置成和cpu的數量相等
worker_processes 1;
# 全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ]
# nginx.conf裏會有兩個日誌,分爲access.log 和 error.log
# access.log主要是記錄"誰來登陸了,從哪裏登陸的,登陸後發生了什麼",具體格式可以在nginx.conf裏設定
# error.log主要記錄的是檢查nginx.conf裏發現的錯誤,模式不支持自定義
# 當打開error.log的時候,可能會看到各種樣的內容,比如:
# 2018/05/03 10:20:51 [emerg] 20952#0: unexpected "}" in /usr/local/nginx/conf/nginx.conf:87
# 這句話就說明在nginx.conf的87行裏有一個 } 是錯誤的,檢查一下}是不是多餘了,或者;少了,這個錯誤的級別是emergency
error_log /usr/local/nginx/logs/error.log info;
# 進程pid文件
# pid /var/log/nginx/nginx.pid;
# 上面的配置會造成ngix找不到pid文件,換成下面的配置即可
pid /var/run/nginx.pid;
# 指定進程可以打開的最大描述符:數目
worker_rlimit_nofile 65535;
# 設置工作模式
events {
# epoll是多路複用IO(I/O Multiplexing)中的一種方式,
# 僅用於linux2.6以上內核,可以大大提高nginx的性能
# 內核版本查看命令:cat /proc/version
use epoll;
# 定義每個進程的最大連接數,受系統進程的最大打開文件數量限制
# 單個進程最大連接數(最大連接數=連接數*進程數)
# 根據硬件調整,和前面工作進程配合起來用,儘量大,但是別把cpu跑到100%就行
worker_connections 65535;
}
# 設定http服務器
http {
# 文件擴展名與文件類型映射表
include mime.types;
# 默認文件類型
default_type application/octet-stream;
# 默認編碼,Nginx的頁面中文亂碼解決
charset utf-8;
# 隱藏Nginx版本號
server_tokens off;
# 設定日誌格式
# 爲了觀察緩存的命中狀態,我們可以將緩存相關的變量記錄在日誌中。
# nginx.conf中配置(在行尾加上'"$upstream_cache_status"'緩存命中狀態即可)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$upstream_cache_status"';
# 設定日誌位置,建議生產階段關閉
access_log /usr/local/nginx/logs/access.log main;
# 開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。
# sendfile: 設置爲on表示啓動高效傳輸文件的模式。sendfile可以讓Nginx在傳輸文件時直接在磁盤和tcp socket之間傳輸數據。如果這個參數不開啓,會先在用戶空間(Nginx進程空間)申請一個buffer,用read函數把數據從磁盤讀到cache,再從cache讀取到用戶空間的buffer,再用write函數把數據從用戶空間的buffer寫入到內核的buffer,最後到tcp socket。開啓這個參數後可以讓數據不用經過用戶buffer
#sendfile on;
sendfile off;
# 此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
#tcp_nopush on;
# 連接超時時間單位是秒,這裏指的是http層面的keep-alive 並非tcp的keepalive
keepalive_timeout 120;
tcp_nodelay on;
# 設定請求緩衝
client_header_buffer_size 32k;
large_client_header_buffers 4 64k;
# 保存服務器名字的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;
# http_proxy設置
proxy_redirect off;
# 請求頭中Host信息
proxy_set_header HOST $host;
# 真實的客戶端IP
proxy_set_header X-Real-IP $remote_addr;
# 代理路由信息,此處取IP有安全隱患
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 真實的用戶訪問協議
proxy_set_header X-Forwarded-Proto $scheme;
# 設置通過nginx上傳文件的大小
# 注1:通過tomcat遠程部署項目時,項目war可能比較大,這個數值可以設置大一些,發佈完項目後再改回10m
client_max_body_size 50m;
# client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 75;
proxy_send_timeout 75;
proxy_read_timeout 75;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
# 開啓nginx的緩存功能
# 定義nginx緩存目錄
# /usr/local/nginx/proxy_cache/cache緩存文件所在目錄,默認不存在,創建即可
# level=1:2 緩存的層次結構爲2層
# keys_zone 緩存空間名稱爲cache_one:10m,大小爲10兆
# inactive=60m 該緩存60分鐘內沒被訪問就把清理掉
# max_size=10g 最大文件緩存爲10G,超過10GNginx的裁判機制會剔除不經常被訪問的緩存
# use_temp_path 如果爲off,則nginx會將緩存文件直接寫入指定的cache文件中,而不使用temp_path指定的臨時存儲路徑
# use_temp_path=on 會生成一個臨時的.tmp緩存,會和自己定義的 /usr/local/nginx/proxy_cache/cache 緩存衝突,導致性能下降,一般關閉
proxy_cache_path /usr/local/nginx/proxy_cache/cache levels=1:2 keys_zone=cache_one:500m inactive=60m max_size=10g use_temp_path=off;
# 定義nginx緩存臨時目錄
# /usr/local/nginx/proxy_cache/temp臨時文件所在目錄。此項在 use_temp_path=off 時不需填寫
# proxy_temp_path /usr/local/nginx/proxy_cache/temp;
# 開啓目錄列表訪問,合適下載服務器,默認關閉。
autoindex on;
# 這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,
# inactive是指經過多長時間文件沒被請求後刪除緩存。
open_file_cache max=65535 inactive=60s;
# 這個是指多長時間檢查一次緩存的有效信息。
open_file_cache_valid 80s;
# open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,
# 文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive時間內一次沒被使用,它將被移除。
open_file_cache_min_uses 1;
# gzip模塊設置
# 開啓nginx gzip壓縮後,網頁、css、js等靜態資源的大小會大大的減少,從而可以節約大量的帶寬,
# 提高傳輸效率,給用戶快的體驗。雖然會消耗cpu資源,但是爲了給用戶更好的體驗是值得的
# 怎麼檢測nginx有沒有開啓gzip?
# 通過瀏覽器查看響應頭:Accept-Encoding: 這部分是不是有gzip,有的話就是已經生效,例如:Accept-Encoding: gzip, deflate
gzip on;
gzip_disable "MSIE [1-6].";
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
gzip_vary on;
# 開啓限制IP連接數的時候需要使用
#limit_zone crawler $binary_remote_addr 10m;
# 負載均衡配置
# 設定負載均衡後臺服務器列表
# 在需要使用負載均衡的server中增加 proxy_pass http://server_pool;
upstream server_pool {
# ip_hash輪詢方式:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,
# 可以有效解決session問題,不可給服務器加權重weight
ip_hash;
# tomcat列表
# max_fails:允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤
# fail_timeout:max_fails次失敗後,暫停的時間。
#server 192.168.199.131:8080 weight=10; //本機ip 但不可使用此種寫法,使用下面127的寫法
#因爲我們此時轉發到的是本機的8080端口,如果使用本機ip的話還需要進行tcp連接,
#這時候防火牆就會把這個端口的tcp連接給攔截掉,本機也無法訪問這個ip的某一端口,使用127.0.0.1就可以完美的避開這個問題
# 指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況
#server 127.0.0.1:8080 weight=10;
server 192.168.43.11:8080 weight=10;
}
#虛擬主機的配置
server {
# 監聽端口
listen 80;
# 域名可以有多個,用空格隔開
# 這裏隨便寫域名或者 刪除 server_name都能正常訪問
server_name _;
# 必須配置開啓緩存功能的location的前面否則不生效
# 用於清除緩存的url設置
# 假設一個URL爲http://www.wangshibo.com/test.gif,那麼就可以通過訪問http://www.wangshibo.com/purge/test.gif清除該URL的緩存。
#location ~ /purge(/.*) {
#設置只允許指定的IP或IP段纔可以清除URL緩存
#allow 127.0.0.1 ;
#allow 192.168.0.0/16 ;
#允許所有IP清除URL緩存
#allow all;
#拒絕所有IP清除URL緩存
#deny all ;
#proxy_cache_purge cache_one $host$1$is_args$args ;
#}
# / 匹配所有路徑,默認對所有請求都做負載均衡+反向代理
location / {
# 可以通過添加自定義header判斷URL匹配了哪個location
#add_header Access-Control-Location '/';
#這裏server_pool指向上面名爲server_pool的upstream
proxy_pass http://server_pool;
}
# 靜態處理交給nginx
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|ico|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|css|js)$ {
# 可以通過添加自定義header判斷URL匹配了哪個location
#add_header Access-Control-Location 'js|css|images';
# nginx對後端靜態資源做緩存
# 使用Web緩存區cache_one,已在nginx.conf的緩存配置中命名的。
proxy_cache cache_one;
# 狀態碼爲200 302 304的緩存12小時,其餘的緩存10分鐘
proxy_cache_valid 200 304 302 12h;
proxy_cache_valid any 10m;
# 添加自定義響應頭中定義緩存的狀態:
# $upstream_cache_status包含以下幾種狀態:
# MISS 未命中,請求被傳送到後端
# HIT 緩存命中
# EXPIRED 緩存已經過期請求被傳送到後端
# UPDATING 正在更新緩存,將使用舊的應答
# STALE 後端將得到過期的應答
add_header Nginx-Cache '$upstream_cache_status from $host';
# 如果出現以下error,或者50*的狀態碼,將會重新負載調度到另一臺服務器上重新請求(不會在一臺服務器上死磕)
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
# 設置Web緩存的Key值,Nginx根據Key值md5哈希存儲緩存,這裏根據"域名,URI,參數"組合成Key
proxy_cache_key $host$uri$is_args$args;
# 忽略瀏覽器中的一些緩存參數,而開啓緩存
proxy_ignore_headers Set-Cookie Cache-Control;
proxy_hide_header Cache-Control;
proxy_hide_header Set-Cookie;
proxy_pass http://server_pool;
}
# 定義錯誤提示頁面,如果在web項目中已經配置500/404錯誤頁面,這裏就不用配置了
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
#}
# 設定查看Nginx狀態的地址,狀態值示例如下:
# Active connections: 11921
# server accepts handled requests
# 11989 11989 11991
# Reading: 0 Writing: 7 Waiting: 42
# active connections – 活躍的連接數量
# server accepts handled requests — 總共處理了11989個連接 , 成功創建11989次握手, 總共處理了11991個請求
# reading — 讀取客戶端的連接數.
# writing — 響應數據到客戶端的數量
# waiting — 開啓 keep-alive 的情況下,這個值等於 active – (reading+writing), 意思就是 Nginx 已經處理完正在等候下一次請求指令的駐留連接.
# nginx unknown directive "stub_status",離線安裝模式默認沒有安裝Nginx沒有添加modules/ngx_http_stub_status_module.o模塊
#location /nginx_status {
#stub_status on;
#access_log off;
#deny 127.0.0.1; #拒絕的ip
#allow 172.18.5.54; #允許的ip
#allow 127.0.0.1;
#deny all;
#}
}
}
cd /usr/local/nginx/conf/
vi nginx.conf
ps -ef | grep nginx # 查看Nginx安裝目錄,master process後面的就是nginx的目錄
nginx的主配置文件結構(重點)
nginx的主配置文件/usr/local/nginx/conf/nginx.conf主要分分爲六個區域:
main(全局設置)、events(nginx工作模式)、http(http設置)、
sever(主機設置)、location(URL匹配)、upstream(負載均衡服務器設置)。
配置文件結構圖
我們這裏配置只是負載均衡多個tomcat,配置不同的tomcat地址
如果是在springcloud項目中我們nginx對應的應該是多個zuul網關
開啓輪詢算法,配置負載均衡地址
然後我們用tomcat發佈一個測試項目
然後訪問通過tomcat訪問項目
然後我們已經配置好了nginx,再來通過nginx來訪問tomcat,訪問成功!
end…