Linux之Nginx使用

  1、nginx安裝(編譯安裝)

  1,安裝須要的依賴庫

yum install -y gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl openssl-devel 
ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

  2,下載nginx安裝源碼包

1,把第三方包都放在opt目錄下,因此先進入opt
cd /opt
2,下載
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz

  3,解壓並進入源文件包

1,解壓
tar -zxvf nginx-1.12.0.tar.gz
2,解壓以後會的生成一個源文件目錄,進入
cd nginx-1.12.0

  4,釋放、編譯、編譯安裝

1,釋放
./configure --prefix=/opt/nginx112
2,編譯及編譯安裝
make && make install

  5,啓動與中止nginx

cd /opt/nginx112/sbin
./nginx #啓動
./nginx -s stop #關閉
./nginx -s reload # 平滑重啓 ,修改了nginx.conf以後,能夠不重啓服務,加載新的配置
或者  /opt/nginx112/sbin/nginx -s reload  # 絕對路徑平滑重啓

  2、配置nginx

  1,進入nginx配置文件

vim /opt/nginx112/conf/nginx.conf

  2,詳解配置信息

#定義nginx工做進程數
worker_processes 5;
#錯誤日誌
#error_log logs/error.log;
#http定義代碼主區域
http {
include mime.types;
default_type application/octet-stream;
#定義nginx的訪問日誌功能
#nginx會有一個accses.log功能,查看用戶訪問的記錄
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';php

#開啓日誌功能
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
#開啓gzip壓縮傳輸
gzip on;
#虛擬主機1 定義一個 
server {
#定義nginx的訪問入口端口,訪問地址是 192.168.12.64:80
listen 80;
#定義網站的域名www.ssss.com
#若是沒有域名,就填寫服務器的ip地址 192.168.12.64
server_name www.ssss.com;
#nginx的url域名匹配
#只要請求來自於www.ssss.com/111111111
#只要請求來自於www.ssss.com/qweqwewqe
#最低級的匹配,只要來自於www.ssss.com這個域名,都會走到這個location
location / {
#這個root參數,也是關鍵字,定義網頁的根目錄
#以nginx安裝的目錄爲相對路徑 /opt/nginx112/html
#能夠自由修改這個root定義的網頁根目錄
root html;
#index參數定義網站的首頁文件名,默認的文件名
index index.html index.htm;
}
#錯誤頁面的優化(只要是遇到前面4系列的錯誤,就會直接跳轉到相對目錄下的40x.html頁面)
error_page 400 401 402 403 404 /40x.html;
}
}html

  上面咱們把域名寫成了www.ssss.com。因而咱們須要在本機的hosts文件加入一條映射關係前端

 

  如今咱們在瀏覽器輸入www.ssss.com就能夠訪問nginx歡迎頁面了,也能夠用192.168.12.64訪問python

  3、nginx多虛擬主機的配置

只須要在配置文件中添加對個server既可
server {
        listen       80;
        server_name  www.ssss1.com;
        #access_log  logs/host.access.log  main;
        location / {
            root   /opt/ssss1/;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen 80;
        server_name www.ssss2.com;
        location / {
            root   /opt/ssss2/;
            index  index.html index.htm;
        }

    }

  由於在上面的配置裏咱們指定了兩個文件目錄,還有文件,因此如今咱們得去建立文件nginx

1,在opt目錄下建立ssss1目錄,在建立一個index.html文件  #對於新建的目錄和文件名字都是隨意的,只要和配置文件裏對應上就好
mkdir /opt/ssss1
vim ssss1/index.html #往這個HTML文件中寫入html代碼

2,和上面同樣的
mkdir /opt/ssss2
vim ssss2/index.html

  修改hosts文件sql

 4、nginx設置

 1,能夠修改nginx錯誤頁面顯示內容

  修改配置文件數據庫

vim /opt/nginx112/conf/nginx.conf
在對應的虛擬主機下(server)添加如下內容(server代碼塊下)

error_page  400 401 402 403 404   /40x.html;
        location = /40x.html {
            root /opt/qishi2douyu/;
        }

  修改錯誤頁面內容vim

vim 40x.html

  2,nginx訪問日誌功能

  修改配置文件後端

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  logs/access.log  main;

  3,nginx限制訪問ip

  修改配置文件瀏覽器

  5、nginx反向代理

  1,準備工做

所謂反向代理,就是,用戶不能直接訪問個人應用服務器的ip了,而是訪問代理服務器的ip,代理服務器把請求轉發給應用服務器
因此這裏須要兩臺服務器。我作的是,本機電腦上的虛擬機作代理,遠程的雲服務器作應用
(你也能夠在本機電腦上跑兩個虛擬機,一個爲代理,一個應用) 應用ip:
192.168.12.64 雲服務器ip:102.123.125.25(這不是真的)

  2,只須要在代理服務器上的nginx配置文件修改既可

  6、nginx負載均衡

  1,準備工做

負載均衡是在反向代理的基礎上實現的,上面的反向代理,應用只有一個服務器,這樣是很危險的,當這個應用服務器蹦了,
整個網站就崩了,因此咱們要把項目同時跑在幾個服務器上,當一個崩了,其餘還在運行着,就不會影響到用戶使用。此時,
一個代理就對應好幾個應用服務器。 我這裏用一個本地虛擬機作代理,兩個雲服務器作應用服務器 本機虛擬機ip:
192.168.12.64 雲服務器1ip;102.123.125.64 雲服務器2ip:102.124.123.54

  2,也只是須要在代理nginx的配置文件修改既可

   3,負載均衡分配方式

nginx 的 upstream目前支持 4 種方式的分配 
1)、輪詢(默認) 
      每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。 
2)、weight 
      指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。
  server 127.0.0.1:8080 weight=2;  
2)、ip_hash 
      每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。  
3)、fair(第三方) 
      按後端服務器的響應時間來分配請求,響應時間短的優先分配。  
4)、url_hash(第三方)

  4,實現多臺服務器之間session共享

  1,不使用session,換成cookie

 能把session改爲cookie,就能避開session的一些弊端,在從前看的一本J2EE的書上,也指明在集羣系統中不能用session,
不然惹出禍端來就很差辦。若是系統不復雜,就優先考慮可否將session去掉,改動起來很是麻煩的話,再用下面的辦法。

  2,應用服務器自行實現共享

asp.net能夠用數據庫或memcached來保存session,從而在asp.net自己創建了一個session集羣,用這樣的方式能夠令
session保證穩定,即便某個節點有故障,session也不會丟失,適用於較爲嚴格但請求量不高的場合。可是它的效率是不會
很高的,不適用於對效率 要求高的場合。 以上兩個辦法都跟nginx沒什麼關係,下面來講說用nginx該如何處理:

  3,ip_hash

nginx中的ip_hash技術可以將某個ip的請求定向到同一臺後端,這樣一來這個ip下的某個客戶端和某個後端就能創建起穩固
的session,ip_hash是在upstream配置中定義的: upstream backend { server
127.0.0.1:8080 ; server 127.0.0.1:9090 ; ip_hash; } ip_hash是容易理解的,可是由於僅僅能用ip這個因子來分配後端,所以ip_hash是有缺陷的,不能在一些狀況下使用: 1/ nginx不是最前端的服務器。ip_hash要求nginx必定是最前端的服務器,不然nginx得不到正確ip,就不能根據ip做hash。
譬如使用的是squid爲最前端,那麼nginx取ip時只能獲得squid的服務器ip地址,用這個地址來做分流是確定錯亂的。
2/ nginx的後端還有其它方式的負載均衡。假如nginx後端又有其它負載均衡,將請求又經過另外的方式分流了,
那麼某個客戶端的請求確定不能定位到同一臺session應用服務器上。這麼算起來,nginx後端只能直接指向應用服務器,
或者再搭一個squid,而後指向應用服務器。最好的辦法是用location做一次分流,將須要session的部分請求經過ip_hash分流,
剩下的走其它後端去。

  4,upstream_hash

爲了解決ip_hash的一些問題,可使用upstream_hash這個第三方模塊,這個模塊多數狀況下是用做url_hash的,
可是並不妨礙將它用來作session共享: 假如前端是squid,他會將ip加入x_forwarded_for這個http_header裏,用upstream_hash能夠用這個頭作因子,
將請求定向到指定的後端: 可見這篇文檔:http:
//www.sudone.com/nginx/nginx_url_hash.html 在文檔中是使用$request_uri作因子,稍微改一下: hash $http_x_forwarded_for; 這樣就改爲了利用x_forwarded_for這個頭做因子,在nginx新版本中可支持讀取cookie值,因此也能夠改爲: hash $cookie_jsessionid; 假如在php中配置的session爲無cookie方式,配合nginx本身的一個userid_module模塊就能夠用nginx自發一個cookie,
可參見userid模塊的英文文檔: http:
//wiki.nginx.org/NginxHttpUserIdModule 另可用姚偉斌編寫的模塊upstream_jvm_route:http://code.google.com/p/nginx-upstream-jvm-route/
相關文章
相關標籤/搜索