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
1,把第三方包都放在opt目錄下,因此先進入opt cd /opt 2,下載 wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
1,解壓 tar -zxvf nginx-1.12.0.tar.gz 2,解壓以後會的生成一個源文件目錄,進入 cd nginx-1.12.0
1,釋放 ./configure --prefix=/opt/nginx112 2,編譯及編譯安裝 make && make install
cd /opt/nginx112/sbin ./nginx #啓動 ./nginx -s stop #關閉 ./nginx -s reload # 平滑重啓 ,修改了nginx.conf以後,能夠不重啓服務,加載新的配置 或者 /opt/nginx112/sbin/nginx -s reload # 絕對路徑平滑重啓
vim /opt/nginx112/conf/nginx.conf
#定義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
只須要在配置文件中添加對個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
修改配置文件數據庫
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
修改配置文件後端
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;
修改配置文件瀏覽器
所謂反向代理,就是,用戶不能直接訪問個人應用服務器的ip了,而是訪問代理服務器的ip,代理服務器把請求轉發給應用服務器 因此這裏須要兩臺服務器。我作的是,本機電腦上的虛擬機作代理,遠程的雲服務器作應用
(你也能夠在本機電腦上跑兩個虛擬機,一個爲代理,一個應用) 應用ip:192.168.12.64 雲服務器ip:102.123.125.25(這不是真的)
負載均衡是在反向代理的基礎上實現的,上面的反向代理,應用只有一個服務器,這樣是很危險的,當這個應用服務器蹦了,
整個網站就崩了,因此咱們要把項目同時跑在幾個服務器上,當一個崩了,其餘還在運行着,就不會影響到用戶使用。此時,
一個代理就對應好幾個應用服務器。 我這裏用一個本地虛擬機作代理,兩個雲服務器作應用服務器 本機虛擬機ip:192.168.12.64 雲服務器1ip;102.123.125.64 雲服務器2ip:102.124.123.54
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(第三方)
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/