1. 程式人生 > >Ubuntu 中nginx使用詳解

Ubuntu 中nginx使用詳解

  1. Xshell使用管理員連線Ubuntu

由於沒有伺服器,所以使用虛擬機器,所有操作都是在ubuntu14中操作的,在操作前需克隆多個虛擬機器。

  • Ubuntu選擇使用者登入設定

ubuntu14 設定可以選擇賬戶登入賬戶:
切換到root使用者: sudo -s
設定密碼:sudo passwd root
cd /usr/share/lightdm/lightdm.conf.d/
編輯 50-ubuntu.conf檔案, 增加greeter-show-manual-login=true
開機就選用root使用者

  • 設定Xshell 連線Ubuntu

修改 vim /etc/ssh/sshd_config
把# Authentication:
LoginGraceTime 120
PermitRootLogin without passwd
StrictModes yes
改成
#Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

  1. Ubuntu安裝SSH、安裝軟體時報錯解決辦法之一

ubuntu14安裝openssh-server報Depends: openssh-client (= 1:7.2p2-4ubuntu2.1)錯誤
解決:sudo apt-get install openssh-client=(1:7.2p2-4ubuntu2.1)版本號會在在錯誤後面會顯示
apt-get remove 與 apt-get purge
存在版本在無法安裝時,可以先解除安裝
rpurge是會刪除配置檔案 remove不會

  1. Linux安裝JDK
  • PPA方式

新增ppa:

  • add-apt-repository ppa:webupd8team/java;
  • apt-get update 是更新sources.list.d下載列表 ,upgrade 是更新已經安裝的軟體包,一般是在upgrade前先update;
  • 安裝oracle-java-installer:( 預設選擇條款 )
  • echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | sudo/usr/bin/debconf-set-selections;
    設定系統預設JDK:(也可以用於切換)
  • sudo update-java-alternatives -s java-7-oracle;
    測試安裝成功:
  • java -version;
  • 離線安裝
  • tar -xzvf 解壓下載的tar.gz的安裝包
  • 修改環境變數:
    sudo vim ~/.bashrc
    #set oracle jdk environment
    export JAVA_HOME=/home/pwade/jdk1.7/jdk1.7.0_67/jdk1.7.0_67
    export JRE_HOME=$ {JAVA_HOME}/jre
    export CLASSPATH=. :$ {JAVA_HOME}/lib:$ {JRE_HOME}/lib
    export PATH=$ {JAVA_HOME}/bin:$PATH
  • 立馬生效:
    source ~/.bashrc
  • 設定系統預設jdk 版本
    sudo update-alternatives --install /usr/bin/java java /home/pwade/jdk1.7/jdk1.7.0_67/bin/java 300
    sudo update-alternatives --install /usr/bin/javac javac /home/pwade/jdk1.7/jdk1.7.0_67/bin/javac 300
    sudo update-alternatives --install /usr/bin/jar jar /home/pwade/jdk1.7/jdk1.7.0_67/bin/jar 300
    sudo update-alternatives --install /usr/bin/javah javah /home/pwade/jdk1.7/jdk1.7.0_67/bin/javah 300
    sudo update-alternatives --install /usr/bin/javap javap /home/pwade/jdk1.7/jdk1.7.0_67/bin/javap 30
  • sudo update-alternatives --config java
  • 測試:java -version
  1. Linux 中Tomcat 安裝
  • https://tomcat.apache.org/download-70.cgi 下載安裝
  • tar -xzvf 解壓,在start.sh檔案中新增:
    #配置 java 環境
    export JAVA_HOME=/home/pwade/jdk1.7/jdk1.7.0_67/jdk1.7.0_67
    export JRE_HOME= J A V A H O M E / j r e e x p o r t C L A S S P A T H = . : e x p o r t P A T H = {JAVA_HOME}/jre export CLASSPATH=.:%{JAVA_HOME}/lib:%{JRE_HOME}/lib export PATH= {JAVA_HOME}/bin:$PATH
    #配置tomcat安裝路徑
    export TOMCAT_HOME=/home/pwade/tomcat7/apache-tomcat-7.0.91
  • setclasspath.sh檔案中新增:
    export JAVA_HOME=/home/pwade/jdk1.7/jdk1.7.0_67/jdk1.7.0_67
    export JRE_HOME=${JAVA_HOME}/jre
  1. Ubuntu 14安裝nginx
  • apt-get install -y gcc 安裝gcc環境,一般不需要
  • sudo apt-get install software-properties-common
  • sudo add-apt-repository ppa:nginx/stable
  • sudo apt-get update
  • sudo apt-get install nginx
  • 檢視版本: nginx -v 檢測語法:nginx -t 啟動 :nginx 關閉:nginx -s stop
  • 檢視埠號: netstat -ntpl
    在這裡插入圖片描述在這裡插入圖片描述
  1. nginx 反向代理

流程:編寫一個location攔截規則,並指定proxy_pass為需要代理的伺服器,下圖是展示反向代理本地tomcat

在這裡插入圖片描述
7. nginx 負載均衡

負載均衡就是在nginx中http伺服器中定義upstream,並在其中配置需要負載均衡的伺服器ip,並在prox_pass中引用即可(名稱要一致)。

在這裡插入圖片描述

//負載均衡具體程式碼實現
 upstream blank {
        # 解決session共享問題,其實就是防止同個使用者訪問通過負載均衡訪問到兩個伺服器而導致需要重    復登入問題
        #ip_hash;
        server 192.168.15.131:8080  weight=2;    #weight-是指權重
        server 192.168.1.132:8080  weight=1;  
    }
       server {
            #nginx監聽80埠,請求該埠時轉發到真實目標
            listen       80;
            #配置訪問域名
            server_name  localhost;                  
        
            location / {
                #這裡配置代理是指上面定義的兩個被代理目標,blank名字必須一致
                proxy_pass http://blank;
                
                #proxy_redirect          off;
                #如果是非80埠,配置為Host $host:埠號,目的是將代理伺服器收到的使用者的資訊傳到真實伺服器上
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout   300;
                proxy_send_timeout      300;
                proxy_read_timeout      300;
                proxy_buffer_size       4k;
                proxy_buffers           4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
                add_header Access-Control-Allow-Origin *;
            }
            
            #此處定義500 502 503 504的錯誤頁面
            error_page   500 502 503 504  /50x.html;
            #錯誤頁面位置
            location = /50x.html {
            #root表示路徑 html為nginx安裝目錄中的html資料夾
            #位於/usr/local/nginx/html/下
               root   html;
            }        
    }

負載均衡五種權重分配

  • 輪詢(預設)
    概念:每個請求按時間順序逐一分配到不同的後端伺服器,後端伺服器down掉,能自動剔除
  • weight
    概念:指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
    例子:
    upstream backend {
    server 192.168.0.14 weight=10;
    server 192.168.0.15 weight=10;
    }
  • ip_hash
    概念:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
    例子:
    upstream backend {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
    }
  • fair(第三方)
    概念:按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
    例子:
    upstream backend {
    server server1.linuxany.com;
    server server2.linuxany.com;
    fair;
    }
  • 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;
    }
  • 定義負載均衡裝置的Ip及裝置狀態
    upstream backend{
    ip_hash; # ip_hash指令不能與weight、backup變數一起使用
    server 127.0.0.1:9090 down;
    server 127.0.0.1:8080;
    server 127.0.0.1:6060;
    server 127.0.0.1:7070 backup;
    }
    backup含義:
    只要在希望成為後備的伺服器ip後面多新增一個backup引數,這臺伺服器就會成為備份伺服器,在平時不使用,nginx不會給它轉發任何請求。只有當其他節點全部無法連線的時候(忙或者down),nginx才會啟用這個節點。一旦有可用的節點恢復服務,該節點則不再使用,又進入後備狀態。
    down 含義:
    表示當前伺服器不參與負載均衡。

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
以上三行,目的是將代理伺服器收到的使用者的資訊傳到真實伺服器上。

  1. nginx location 匹配規則

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ,* 正則順序) > (location 部分起始路徑) > (/) 當有匹配成功時候,停止匹配,按當前匹配規則處理請求

 location ~* /js/.*/\.js
以 = 開頭,表示精確匹配;如只匹配根目錄結尾的請求,後面不能帶任何字串。
以^~ 開頭,表示uri以某個常規字串開頭,不是正則匹配
以~ 開頭,表示區分大小寫的正則匹配;
以~* 開頭,表示不區分大小寫的正則匹配
以/ 開頭,通用匹配, 如果沒有其它匹配,任何請求都會匹配到
!~       區分大小寫不匹配
!~*     不區分大小寫不匹配
             # ^~ 不是正則表示式匹配url開頭
             #規則:匹配以jsp結尾的檔案(~* \.(jsp)$) 、只匹配index和second頁面 (~* /demo/(index.jsp|second.jsp)$)、匹配以demo開頭的url路徑 (^~ /demo/)
            location ~* /demo/(index.jsp)$ {
                #這裡配置代理是指上面定義的兩個被代理目標,blank名字必須一致
               # proxy_pass http://blank;
                rewrite ^/demo/index.jsp$  /demo/second.jsp break;
                #rewrite ^/demo/index.jsp  /demo/second.jsp last;  
                #proxy_redirect          off;
                #這個變數開啟後,我們才能自定義錯誤頁面,當後端返回404,nginx攔截錯誤定義錯誤頁面
                proxy_intercept_errors on;
                #如果是非80埠,配置為Host $host:埠號,目的是將代理伺服器收到的使用者的資訊傳到真實伺服器上
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout   300;
                proxy_send_timeout      300;
                proxy_read_timeout      300;
                proxy_buffer_size       4k;
                proxy_buffers           4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
                add_header Access-Control-Allow-Origin *;
            }
  1. nginx 涉及指令集
  • if指令
    語法:if(condition){…}
    作用域:server,location
    if ($ http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break; }

  • return指令
    語法:return code;
    作用域:server,location,if

  • set指令
    語法:set variable value;
    作用域:server,location,if

  • uninitialized_variable_warn指令
    作用域:http,server,location,if
    語法:uninitialized_variable_warn on | off;

  • rewrite指令
    從一個location跳轉到另一個location,不過這樣的迴圈最多可以執行10次,超過後nginx將返回500錯誤。
    作用域:server,location,if
    語法:rewrite regex replacement [flag];
    小括號()之間匹配的內容,可以在後面通過$1來引用,$2表示的是前面第二個()裡的內容。正則裡面容易讓人困惑的是\轉義特殊字元。
    rewrite 指令的flag標誌位:
    last : 相當於Apache的[L]標記,表示完成rewrite
    break : 停止執行當前虛擬主機的後續rewrite指令集
    redirect : 返回302臨時重定向,位址列會顯示跳轉後的地址
    permanent : 返回301永久重定向,位址列會顯示跳轉後的地址
    last使用

  • break 和 last區別:
    在這裡插入圖片描述
    last
    (1)last 和 break 當出現在location 之外時,兩者的作用是一致的沒有任何差異。
    注意一點就是,他們會跳過所有的在他們之後的rewrite 模組中的指令,去選擇自己匹配的location
    (2)last 和 break 當出現在location 內部時,兩者就存在了差異:
    兩者的區別在於當rewrite指令存在於localtion區塊時, last跳出localtion塊, 重新從server開始進行localtion匹配; 而break跳過localtion下的後續rewrite規則, 執行其他指令.

  • redirect與permanent 關係:
    這兩個flag是進行重定向(302臨時, 301永久), 重定向以後的url也會顯示在位址列, nginx處理這兩個是會中斷流程, 通過http請求告訴使用者端進行重定向, 也就是這次請求不需要進過後端服務,由nginx全職負責.

  • if 全域性變數列表:
    $ args #這個變數等於請求行中的引數,同$query_string;
    $ content_length #請求頭中的Content-length欄位;
    $content_type #請求頭中的Content-Type欄位;
    $document_root #當前請求在root指令中指定的值,如:root /var/www/html;
    $host #請求主機頭欄位,否則為伺服器名稱;
    $http_user_agent #客戶端agent資訊;
    $http_cookie #客戶端cookie資訊;
    $limit_rate #這個變數可以限制連線速率;
    $request_method #客戶端請求的動作,通常為GET或POST;
    $remote_addr #客戶端的IP地址;
    $remote_port #客戶端的埠;
    $remote_user #已經經過Auth Basic Module驗證的使用者名稱;
    $request_filename #當前請求的檔案路徑,由root或alias指令與URI請求生成;
    $scheme #HTTP方法(如http,https);
    $server_protocol #請求使用的協議,通常是HTTP/1.0或HTTP/1.1;
    $server_addr #伺服器地址,在完成一次系統呼叫後可以確定這個值;
    $server_name #伺服器名稱;
    $server_port #請求到達伺服器的埠號;
    $request_uri #包含請求引數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”;
    KaTeX parse error: Expected 'EOF', got '#' at position 20: … #̲不帶請求引數的當前URI,uri不包含主機名,如”/foo/bar.html”;
    KaTeX parse error: Expected 'EOF', got '#' at position 20: …ment_uri #̲與uri相同,例:http://localhost:88/test1/test2/test.php;
  1. nginx 定義反向代理404等錯誤頁面

location中開啟錯誤頁面攔截(proxy_intercept_errors on)–》定義錯誤頁面( error_page )–》定義location攔截規則,攔截後到指定的目錄尋找頁面,如下圖定義的 /usr/local/nginx/html/
在這裡插入圖片描述

 //程式碼實現
 location ~* /demo/(index.jsp)$ {
                #這裡配置代理是指上面定義的兩個被代理目標,blank名字必須一致
               # proxy_pass http://blank;
                rewrite ^/demo/index.jsp$  /demo/second.jsp break;
                #rewrite ^/demo/index.jsp  /demo/second.jsp last;  
                #proxy_redirect          off;
                #這個變數開啟後,我們才能自定義錯誤頁面,當後端返回404,nginx攔截錯誤定義錯誤頁面
                proxy_intercept_errors on;
                #如果是非80埠,配置為Host $host:埠號,目的是將代理伺服器收到的使用者的資訊傳到真實伺服器上
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout   300;
                proxy_send_timeout      300;
                proxy_read_timeout      300;
                proxy_buffer_size       4k;
                proxy_buffers           4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
                add_header Access-Control-Allow-Origin *;
            }
              #此處定義500 502 503 504的錯誤頁面
            error_page   500 502 503 504  /404.html;
            #錯誤頁面位置,與上面路徑需要對應。
            location = /404.html {
            #root表示路徑 html為nginx安裝目錄中的html資料夾
            #位於/usr/local/nginx/html/下
               root  /usr/local/nginx/html/;
            }      

自己對nginx的理解,有錯誤麻煩各位指出,謝謝!