RE|Nginx-安裝與配置(1)

Nginx

本文裏面介紹了 Nginx的安裝,代理,負載均衡,location的正則配置,動靜分離,緩存,壓縮,防盜鏈,跨域處理javascript

1. 定義:

Nginx 是一個HTTP和反向代理服務器,一個郵件代理服務器和一個通用的TCP/UDP代理服務器。css

2. 簡介

  • Nginx 是一個高性能的 Web 和反向代理服務器, 它具備有不少很是優越的特性:html

  • 做爲 Web 服務器:相比 Apache,Nginx 使用更少的資源,支持更多的併發鏈接,體現更高的效率,這點使 Nginx 尤爲受到虛擬主機提供商的歡迎。可以支持高達 50,000 個併發鏈接數的響應,感謝 Nginx 爲咱們選擇了 epoll and kqueue 做爲開發模型.前端

  • 做爲負載均衡服務器:Nginx 既能夠在內部直接支持 Rails 和 PHP,也能夠支持做爲 HTTP代理服務器對外進行服務。Nginx 用 C 編寫, 不管是系統資源開銷仍是 CPU 使用效率都比 Perlbal 要好的多。java

  • 做爲郵件代理服務器: Nginx 同時也是一個很是優秀的郵件代理服務器(最先開發這個產品的目的之一也是做爲郵件代理服務器),Last.fm 描述了成功而且美妙的使用經驗。linux

  • Nginx 安裝很是的簡單,配置文件 很是簡潔(還可以支持perl語法),Bugs很是少的服務器:Nginx啓動特別容易,而且幾乎能夠作到7*24不間斷運行,即便運行數個月也不須要從新啓動。你還可以在不間斷服務的狀況下進行軟件版本的升級。nginx

3. 安裝

Windos安裝:c++

  1. 下載nginx nginx.org/download/ng…web

  2. 雙擊啓動nginx程序正則表達式

Linux安裝:

在linux下面存在兩種安裝方式:

  1. 編譯安裝
  2. yum安裝

Yum安裝 【centOs7纔有Yum】:

  1. 若是沒有安裝 Nginx 的源須要安裝一下Nginx的源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
複製代碼

[1] Yum 安裝 Nginx

yum install nginx
複製代碼

[2] 命令 Nginx 啓動 Nginx服務

nginx
複製代碼

[3] nginx的路徑以下

(1) Nginx配置路徑:/etc/nginx/

(2) PID目錄:/var/run/nginx.pid

(3) 錯誤日誌:/var/log/nginx/error.log

(4) 訪問日誌:/var/log/nginx/access.log

(5) 默認站點目錄:/usr/share/nginx/html
複製代碼

編譯安裝

  1. 下載nginx
wget http://nginx.org/download/nginx-1.15.12.tar.gz
複製代碼
  1. 安裝須要編譯的插件

Gcc:yum install gcc c++ (用於編譯c、c++代碼)
Pcre:yum install -y pcre pcre-devel (用c語言編寫的正則表達式函數庫))
Zlib:yum install -y zlib zlib-devel (用於數據壓縮的函式庫))
OpenSSL:yum install -y openssl openssl-devel (安全套接字層密碼庫))

yum install -y pcre pcre-devel
yum install -y zlib zlib-devel 
yum install -y openssl openssl-devel  
複製代碼
  1. 編譯Nginx
tar -zxvf nginx-1.15.tar.gz
cd nginx-1.15
./configure
make
make install
複製代碼
  1. 啓動nginx
cd /usr/local/nginx/
cd sbin/
./nginx 
複製代碼

3. 代理

正向代理:正向代理代理的是用戶

反向代理:方向代理代理的是服務器

4. 準備

咱們要演示Nginx的相關配置須要3臺服務器,裏面用Tomcat。爲了咱們區分咱們在每一個Tomcat裏面的index.jsp裏面寫入的本機的Ip。啓動Tomcat,出現以下效果。

咱們隨機選擇其中一臺,修改裏面的 nginx.conf

# http://10.18.3.197/ 代理

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
    proxy_pass http://127.0.0.1:8080;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}
複製代碼

那麼代理了本機8080端口的數據

接下來咱們使用windos的本機的Host劫持

進入 C:\Windows\System32\drivers\etc 這個文件
修改 hosts 文件
在裏面添加 10.18.3.197 test.com
複製代碼

咱們瀏覽器訪問如圖:

咱們準備好了環境和相關配置那麼咱們接下來看Nginx的一些配置。

5. location配置

location = /uri 精準匹配
location ^~ /uri 前綴匹配
location ~ /uri
location / 通用匹配

舉個例子:
1 location = /
2 location = /index
3 location ^~ /article/
4 location ^~ /article/files/
5 location ~ .(gif|png|js|css)$
6 location /
http://10.18.3.197/
http://10.18.3.197/index ->2
http://10.18.3.197/article/files/1.txt ->4
http://10.18.3.197/mic.png ->5

6. Nginx的插件的使用

# 使用編譯安裝的時候插件的安裝按時
./configure --prefix=/安裝目錄 --add-module = /第三方模塊的目錄 <br/>
./configure --prefix=/data/program/nginx --with-http_stub_status_module --withhttp_random_index_module
cp objs/nginx $nginx_home/sbin/nginx
複製代碼

舉個例子

安裝 http_stub_status_module

# 查看nginx的狀態
location /status {
    stub_status;
}
複製代碼

Active: connections:當前狀態,活動狀態的鏈接數
accepts:統計總值,已經接受的客戶端請求的總數
handled:統計總值,已經處理完成的客戶端請求的總數
requests:統計總值,客戶端發來的總的請求數
Reading:當前狀態,正在讀取客戶端請求報文首部的鏈接的鏈接數
Writing:當前狀態,正在向客戶端發送響應報文過程當中的鏈接數
Waiting:當前狀態,正在等待客戶端發出請求的空閒鏈接數

7.Nginx負載均衡

1、 輪詢

每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。

 # 負載均衡默認的輪詢算法
upstream webserver {
	server 10.18.14.59:8080;
   	server 10.18.14.109:8080;
	server 10.18.3.197:8080;
}

server {
    ...
    location / {
    	   # proxy_pass http://127.0.0.1:8080;
               proxy_pass http://webserver;
            }
    }
    ...
}

複製代碼

每一次的刷新瀏覽器裏面的地址,獲得都是一個新的服務器的IP,進行輪訓。
若是咱們關閉掉其中的一條服務器,而後去訪問咱們發現,宕機的那臺服務器不會被訪問。若是咱們再次重啓那臺宕機的服務器,刷新瀏覽器的IP地址咱們發現又能夠負載均衡到那臺服務器上面了。

2、 輪詢加權

# 負載均輪詢加權算法
upstream webserver {
    server 10.18.14.59:8080 weight=2;
    server 10.18.14.109:8080 weight=3;
    server 10.18.3.197:8080 weight=5;
}
複製代碼

每臺服務器處理的請求數量,跟權重成正比。也就是權重越大,處理的請求數量越多。

3、 ip_hash

若是客戶已經訪問了某個服務器,當用戶再次訪問時,會將該請求經過哈希算法,自動定位到該服務器。每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器。咱們發咱們每一次的刷新並無分配到其餘機器,而是一直在同一臺機器上,若是宕機後從新分配後,不在改變。

# 負載均衡ip_hash算法
upstream webserver {
    ip_hash;    #保證每一個訪客固定訪問一個後端服務器
    server 10.18.14.59:8080;
    server 10.18.14.109:8080;
    server 10.18.3.197:8080;
}
複製代碼

4、least_conn 最小鏈接數

把請求轉發給鏈接數較少的後端服務器。輪詢算法是把請求平均的轉發給各個後端,使它們的負載大體相同;可是,有些請求佔用的時間很長,會致使其所在的後端負載較高。這種狀況下,least_conn這種方式就能夠達到更好的負載均衡效果。

# 負載均衡最小鏈接數算法
upstream webserver {
    least_conn;    #把請求轉發給鏈接數較少的後端服務器
    server 10.18.14.59:8080;
    server 10.18.14.109:8080;
    server 10.18.3.197:8080;
}
複製代碼

此負載均衡策略適合請求處理時間長短不一形成服務器過載的狀況。

5、fair 響應時間最短

按照服務器端的響應時間來分配請求,響應時間短的優先分配。

# 負載均衡響應時間最短算法
upstream webserver {
    server 10.18.14.59:8080;
    server 10.18.14.109:8080;
    server 10.18.3.197:8080;
    fair;    #實現響應時間短的優先分配
}
複製代碼

6、url_hash

按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,要配合緩存命中來使用。同一個資源屢次請求,可能會到達不一樣的服務器上,致使沒必要要的屢次下載,緩存命中率不高,以及一些資源時間的浪費。而使用url_hash,可使得同一個url(也就是同一個資源請求)會到達同一臺服務器,一旦緩存住了資源,再此收到請求,就能夠從緩存中讀取。 

# 負載均衡url_hash算法
upstream webserver {
    hash $request_uri;    #實現每一個url定向到同一個後端服務器
    server 10.18.14.59:8080;
    server 10.18.14.109:8080;
    server 10.18.3.197:8080;
}
複製代碼

八、相關的配置信息

  • proxy_next_upstream

proxy_next_upstream
語法:proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off ];
默認:proxy_next_upstream error timeout;

配置塊:http、server、location

這個配置表示當向一臺上有服務器轉發請求出現錯誤的時候,繼續換一臺上後服務器來處理這個請求。 默認狀況下,上游服務器一旦開始發送響應數據,Nginx反向代理服務器會馬上把應答包轉發給客戶端。所以,一 旦Nginx開始向客戶端發送響應包,若是中途出現錯誤也不容許切換到下一個上有服務器繼續處理的。這樣作的目 的是保證客戶端只收到來自同一個上游服務器的應答。

  • proxy_connect_timeout

proxy_connect_timeout
語法: proxy_connect_timeout time;
默認: proxy_connect_timeout 60s;

配置塊: http, server, location

用於設置nginx與upstream server的鏈接超時時間,好比咱們直接在location中設置proxy_connect_timeout 1ms, 1ms很短,若是沒法在指定時間創建鏈接,就會報錯。

  • proxy_send_timeout

向後端寫數據的超時時間,兩次寫操做的時間間隔若是大於這個值,也就是過了指定時間後端尚未收到數據,連 接會被關閉

  • proxy_read_timeout

從後端讀取數據的超時時間,兩次讀取操做的時間間隔若是大於這個值,那麼nginx和後端的連接會被關閉,若是 一個請求的處理時間比較長,能夠把這個值設置得大一些

  • proxy_upstream_fail

  • proxy_upstream_fail_timeout

設置了某一個upstream後端失敗了指定次數(max_fails)後,在fail_timeout時間內再也不去請求它,默認爲10秒 語法 server address [fail_timeout=30s]

upstream backend { #服務器集羣名字
    server 192.168.218.129:8080 weight=1 max_fails=2 fail_timeout=600s;
    server 192.168.218.131:8080 weight=1 max_fails=2 fail_timeout=600s;
}
複製代碼

9.處理跨域問題

什麼叫跨域呢?若是兩個節點的協議、域名、端口、子域名不一樣,那麼進行的操做都是跨域的,瀏覽器爲了安全問 題都是限制跨域訪問,因此跨域實際上是瀏覽器自己的限制。

location / {
    proxy_pass http://webserver;
    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_next_upstream error timeout http_500 http_503;
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    add_header 'Access-Control-Allow-Origin' '*'; // #容許來自全部的訪問地址
    add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS'; //支持的請求方式
    add_header 'Access-Control-Allow-Header' 'Content-Type,*'; //支持的媒體類型
}
複製代碼

10.動靜分離

必須依賴服務器生存的咱們稱爲動。不須要依賴容器的好比css/js或者圖片等,這類就叫靜。

靜態資源類型

types {
    text/html html htm shtml;
    text/css css;
    text/xml xml;
    image/gif gif;
    image/jpeg jpeg jpg;
    application/javascript js;
    application/atom+xml atom;
    application/rss+xml rss;
    text/mathml mml;
    text/plain txt;
    text/vnd.sun.j2me.app-descriptor jad;
    text/vnd.wap.wml wml;
    text/x-component htc;
    image/png png;
    image/svg+xml svg svgz;
    image/tiff tif tiff;
    image/vnd.wap.wbmp wbmp;
    image/webp webp;
    image/x-icon ico;
    image/x-jng jng;
    image/x-ms-bmp bmp;
    application/font-woff woff;
    application/java-archive jar war ear;
    application/json json;
    application/mac-binhex40 hqx;
    application/msword doc;
    application/pdf pdf;
    application/postscript ps eps ai;
    application/rtf rtf;
    application/vnd.apple.mpegurl m3u8;
    application/vnd.google-earth.kml+xml kml;
    application/vnd.google-earth.kmz kmz;
    application/vnd.ms-excel xls;
    application/vnd.ms-fontobject eot;
    application/vnd.ms-powerpoint ppt;
    application/vnd.oasis.opendocument.graphics odg;
    application/vnd.oasis.opendocument.presentation odp;
    application/vnd.oasis.opendocument.spreadsheet ods;
    application/vnd.oasis.opendocument.text odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
    pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
    docx;
    application/vnd.wap.wmlc wmlc;
    application/x-7z-compressed 7z;
    application/x-cocoa cco;
    application/x-java-archive-diff jardiff;
    application/x-java-jnlp-file jnlp;
    application/x-makeself run;
    application/x-perl pl pm;
    application/x-pilot prc pdb;
    application/x-rar-compressed rar;
    application/x-redhat-package-manager rpm;
    application/x-sea sea;
    application/x-shockwave-flash swf;
    application/x-stuffit sit;
    application/x-tcl tcl tk;
    application/x-x509-ca-cert der pem crt;
    application/x-xpinstall xpi;
    application/xhtml+xml xhtml;
    application/xspf+xml xspf;
    application/zip zip;
    application/octet-stream bin exe dll;
    application/octet-stream deb;
    application/octet-stream dmg;
    application/octet-stream iso img;
    application/octet-stream msi msp msm;
    audio/midi mid midi kar;
    audio/mpeg mp3;
    audio/ogg ogg;
    audio/x-m4a m4a;
    audio/x-realaudio ra;
    video/3gpp 3gpp 3gp;
    video/mp2t ts;
    video/mp4 mp4;
    video/mpeg mpeg mpg;
    video/quicktime mov;
    video/webm webm;
    video/x-flv flv;
    video/x-m4v m4v;
    video/x-mng mng;
    video/x-ms-asf asx asf;
    video/x-ms-wmv wmv;
    video/x-msvideo avi;
}

複製代碼

在Nginx的conf目錄下,有一個mime.types文件用戶訪問一個網站,而後從服務器端獲取相應的資源經過瀏覽器進行解析渲染最後展現給用戶,而服務端能夠返回各類類型的內容,好比xml、jpg、png、gif、flash、MP四、html、css等等,那麼瀏覽器就是根據mime-type來決定用什麼形式來展現的服務器返回的資源給到瀏覽器時,會把媒體類型告知瀏覽器,這個告知的標識就是Content-Type,好比ContentType:text/html。

location ~ .*\.(js|css|png|svg|ico|jpg) {
    root /.(路徑)./static-resource; # 指定訪問的目錄
}

複製代碼

舉個例子:

咱們設置攔截靜態資源,而後刪除本機tomcat裏面的靜態資源,獲得以下:

將咱們刪除的tomcat靜態資源放入對應的文件夾內

動靜分離的好處
第一個,Nginx自己就是一個高性能的靜態web服務器;
第二個,其實靜態文件有一個特色就是基本上變化不大,因此動靜分離之後咱們能夠對靜態文件進行緩存、或者壓 縮提升網站性能。如今比較流行先後端分離,這樣能夠大大減輕服務端的壓力

12.緩存配置

當一個客戶端請求web服務器, 請求的內容能夠從如下幾個地方獲取:服務器、瀏覽器緩存中或緩存服務器中。這取決於服務器端輸出的頁面信息瀏覽器緩存將文件保存在客戶端,好的緩存策略能夠減小對網絡帶寬的佔用,能夠提升訪問速度,提升用戶的體驗,還能夠減輕服務器的負擔nginx緩存配置

Nginx緩存配置

Nginx能夠經過expires設置緩存,好比咱們能夠針對圖片作緩存,由於圖片這類信息基本上不會改變。 在location中設置expires

格式: expires 30s|m|h|d
location ~ .*\.(jpg|jpeg|gif|bmp|png|js|css|ico) {
    root static;
    expires 1d; # 設置過時時間爲1天
}
複製代碼

13.壓縮

咱們一個網站必定會包含不少的靜態文件,好比圖片、腳本、樣式等等,而這些css/js可能自己會比較大,那麼在 網絡傳輸的時候就會比較慢,從而致使網站的渲染速度。所以Nginx中提供了一種Gzip的壓縮優化手段,能夠對後 端的文件進行壓縮傳輸,壓縮之後的好處在於可以下降文件的大小來提升傳輸效率。

配置信息

Gzip on|off 是否開啓gzip壓縮

Gzip_buffers 4 16k #設置gzip申請內存的大小,做用是按指定大小的倍數申請內存空間。4 16k表明按照原始數據 大小以16k爲單位的4倍申請內存。

Gzip_comp_level[1-9] 壓縮級別, 級別越高,壓縮越小,可是會佔用CPU資源

Gzip_disable #正則匹配UA 表示什麼樣的瀏覽器不進行gzip

Gzip_min_length #開始壓縮的最小長度(小於多少就不作壓縮),能夠指定單位,好比 1k

Gzip_http_version 1.0|1.1 表示開始壓縮的http協議版本

Gzip_proxied (nginx 作前端代理時啓用該選項,表示不管後端服務器的headers頭返回什麼信息,都無條件啓用 壓縮)

Gzip_type text/pliain,application/xml 對那些類型的文件作壓縮 (conf/mime.conf)

Gzip_vary on|off 是否傳輸gzip壓縮標識; 啓用應答頭"Vary: Accept-Encoding";給代理服務器用的,有的瀏覽器支 持壓縮,有的不支持,因此避免浪費不支持的也壓縮,因此根據客戶端的HTTP頭來判斷,是否須要壓縮

http {
    gzip on;
    gzip_min_length 5k;
    gzip_comp_level 3;
    gzip_types application/javascript image/jpeg image/svg+xml;
    gzip_buffers 4 32k;
    gzip_vary on;
}

複製代碼

14.防盜鏈

http 協議中,若是從一個網頁跳到另外一個網頁,http 頭字段裏面會帶個 Referer。圖片服務器經過檢測 Referer 是否來自規定域名,來進行防盜鏈。

語法: valid_referers none | blocked | server_names | string ...;
默認值: —
上下文: server, location

「Referer」請求頭爲指定值時,內嵌變量$invalid_referer被設置爲空字符串,不然這個變量會被置成「1」。查找匹配 時不區分大小寫,其中none表示缺乏referer請求頭、blocked表示請求頭存在,可是它的值被防火牆或者代理服務 器刪除、server_names表示referer請求頭包含指定的虛擬主機名

配置以下
server {
    ...
    server_name  test.com;
    ...
    location ~ .*\.(gif|jpg|ico|png|css|svg|js) {
        valid_referers none blocked test.com 10.18.3.197;
        if ($invalid_referer) {
            return 404;
        }
        root static;
    }
    ...
}

複製代碼

須要注意的是僞造一個有效的「Referer」請求頭是至關容易的,所以這個模塊的預期目的不在於完全地阻止這些非法請求,而 是爲了阻止由正常瀏覽器發出的大規模此類請求。還有一點須要注意,即便正常瀏覽器發送的合法請求,也可能沒 有「Referer」請求頭。

還有跟多的防盜鏈的配置和破解我在就不描述了,應爲在對頁面也就是前端來講,沒有絕對的安全。
下面是關於nginx的防盜鏈的文章和防盜鏈的防護和破解。 www.cnblogs.com/limeng951/p…
www.cnblogs.com/saysmy/p/86…

這個裏面講了如何禁止使用F12查看源代碼,以及右鍵查看元素
www.3lian.com/edu/2013/10… 可是這些都不能反正查看源代碼,若是我用以前就打開F12模式在進入你的網站你如何防禦呢?因此對於前端來講沒有絕對的安全和保密。

相關文章
相關標籤/搜索