1. 程式人生 > 實用技巧 >Nginx反向代理及負載均衡實現過程

Nginx反向代理及負載均衡實現過程

首先 安裝nginx

.各節點時間同步

123[[email protected] ~]# ntpdate 202.120.2.101[[email protected] ~]# ntpdate 202.120.2.101[[email protected] ~]# ntpdate 202.120.2.101

6.關閉防火牆與SELinux

123456789101112[[email protected] ~]# service iptables stop[[email protected] ~]# chkconfig iptables off[[email protected]
~]
# getenforceDisabled[[email protected] ~]# service iptables stop[[email protected] ~]# chkconfig iptables off[[email protected] ~]# getenforceDisabled[[email protected] ~]# service iptables stop[[email protected] ~]# chkconfig iptables off[[email protected] ~]# getenforceDisabled

安裝依賴包
#yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

下載nginx
#cd /usr/local/src
#wget http://www.nginx.org/download/nginx-1.0.9.tar.gz
#tar zxvf nginx-1.0.9.tar.gz
#cd nginx-1.0.9

配置安裝
#./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx/nginx.pid --

lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/
#make
#make install

2.新建nginx使用者與組

1234[[email protected] src]# groupadd -g 108 -r nginx[[email protected] src]# useradd -u 108 -r -g 108 nginx[[email protected] src]# id nginxuid=108(nginx) gid=108(nginx) 組=108(nginx)


為nginx提供SysV init指令碼

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110[[email protected] ~]# cat /etc/init.d/nginx#!/bin/sh## nginx - this script starts and stops the nginx daemon## chkconfig: - 85 15# description: Nginx is an HTTP(S) server, HTTP(S) reverse \# proxy and IMAP/POP3 proxy server# processname: nginx# config: /etc/nginx/nginx.conf# config: /etc/sysconfig/nginx# pidfile: /var/run/nginx.pid# Source function library../etc/rc.d/init.d/functions# Source networking configuration../etc/sysconfig/network# Check that networking is up.["$NETWORKING"="no"] &&exit0nginx="/usr/sbin/nginx"prog=$(basename$nginx)NGINX_CONF_FILE="/etc/nginx/nginx.conf"[ -f/etc/sysconfig/nginx] && ./etc/sysconfig/nginxlockfile=/var/lock/subsys/nginxmake_dirs() {# make required directoriesuser=`nginx -V 2>&1 |grep"configure arguments:"|sed's/[^*]*--user=\([^ ]*\).*/\1/g'-`options=`$nginx -V 2>&1 |grep'configure arguments:'`foroptin$options;doif[ `echo$opt |grep'.*-temp-path'` ];thenvalue=`echo$opt |cut-d"="-f 2`if[ ! -d"$value"];then# echo "creating" $valuemkdir-p $value &&chown-R $user $valuefifidone}start() {[ -x $nginx ] ||exit5[ -f $NGINX_CONF_FILE ] ||exit6make_dirsecho-n $"Starting $prog: "daemon $nginx -c $NGINX_CONF_FILEretval=$?echo[ $retval -eq0 ] &&touch$lockfilereturn$retval}stop() {echo-n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq0 ] &&rm-f $lockfilereturn$retval}restart() {configtest ||return$?stopsleep1start}reload() {configtest ||return$?echo-n $"Reloading $prog: "killproc $nginx -HUPRETVAL=$?echo}force_reload() {restart}configtest() {$nginx -t -c $NGINX_CONF_FILE}rh_status() {status $prog}rh_status_q() {rh_status >/dev/null2>&1}case"$1"instart)rh_status_q &&exit0$1;;stop)rh_status_q ||exit0$1;;restart|configtest)$1;;reload)rh_status_q ||exit7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q ||exit0;;*)echo$"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit2esac

為此指令碼賦予執行許可權

1[[email protected] ~]# chmod +x /etc/init.d/nginx

新增至服務管理列表,並讓其開機自動啟動

1234[[email protected] ~]# chkconfig --add nginx[[email protected] ~]# chkconfig nginx on[[email protected] ~]# chkconfig nginx --listnginx 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉

8.啟動nginx

12[[email protected] ~]# service nginx start正在啟動 nginx:

檢視一下埠

12[[email protected] ~]# netstat -ntlp | grep :80

備份 cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

反向代理

[[email protected] nginx-1.0.9]# mkdir /usr/html/forum

[[email protected] nginx-1.0.9]# vi /usr/html/forum/index.html

然後 通過http://192.168.16.246/forum/ 訪問頁面

在 另一臺(伺服器 httpd配置如下)

[[email protected] ~]# cd /var/www/html/

mkdirbbs

vi /var/www/html/bbs/index.html


新增

location /forum/ {

proxy_pass http://192.168.16.230/bbs;

proxy_set_header X-Real-IP $remote_addr;

}

wKioL1RoNpry4be6AADYBNRe3B4042.jpg

指令說明proxy_set_header

語法:proxy_set_header header value
預設值: Host and Connection
使用欄位:http, server, location
這個指令允許將傳送到被代理伺服器的請求頭重新定義或者增加一些欄位。這個值可以是一個文字,變數或者它們的組合。proxy_set_header在指定的欄位中沒有定義時會從它的上級欄位繼承。


這樣我每次轉發給後端的時候 後端都會有一個首部叫X-Real-IP 這個X-Real-IP 也會被傳送至客戶端

接下來 我們修改vi /etc/httpd/conf/httpd.conf

把LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

修改為:LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

這樣在訪問web伺服器時記錄的 不是nginx轉發器的ip 而是訪問使用者的ip 有利於日誌分析

wKiom1RoIFqjU3cCAAEzakjsFKo645.jpg

這是將/forum 下的檔案轉發到 另一臺web伺服器上 萬一後端的web 扛不住了 怎麼辦》?

負載均衡


安裝scp的軟體包:

# yum install openssh-clients

這是我學習的一個命令 scp 2端都要安裝openssh

scp /var/www/html/bbs/index.html 192.168.16.240:/var/www/html/ 這樣就複製到240上去了 只要做下修改就行

web1 mv /var/www/html/bbs/index.html /var/www/html/index.html

upstream 負載均衡模組說明

在service上新增如下

upstream webserver{

server 192.168.16.230 weight=1;

server 192.168.16.240 weight=1;

}

這裡註釋掉預設的location 具體如下圖

location / {

proxy_pass http://webserver/;

proxy_set_header X-Real-IP $remote_addr;

}


wKiom1RoPgmhjLHFAAJGQv7W-r4437.jpg

這樣當你訪問 192.168.16.246時 重新整理第一個頁面是web1的頁面 重新整理第二個頁面是第二個web2頁面


如果不幸某天web機器down了 nginx 有自帶的健康檢查功能 可以自己自動設定秒數 預設為10秒

upstream webserver{

server 192.168.16.230 weight=1;max_fails=2 fail_timeout=2;

server 192.168.16.240 weight=1;max_fails=2 fail_timeout=2;

}

我們這裡設定的是4秒時間

這樣我們把web2 down了 ;重新整理的頁面永遠是web1 web2啟用 他又自動迴圈

假如 2臺web伺服器down機了那麼會帶來使用者體驗的降低我們需要定義sorry頁面。。

這裡我就用本地的8080埠來區別

建立一個虛擬主機

server {

listen 8080;

server_name 127.0.0.1;

root /web/errorpages;

index index.html;

}

然後建立mkdir -pv /web/errorpages 目錄

vi index.html頁面。。。。。

接下來新增

upstream webserver{

server 192.168.16.230 weight=1 max_fails=2 fail_timeout=2;

server 192.168.16.240 weight=1 max_fails=2 fail_timeout=2;

server 127.0.0.1:8080 backup;

這樣down掉負載2臺 接著訪問192.168.16.246 的頁面 會如圖下

wKioL1RoUNzz_HgoAAC_DAHT9pE331.jpg

轉載於:https://blog.51cto.com/zaizai1573/1576989