Nginx反向代理部署指南

Nginx反向代理部署指南

.反向代理

  我們都知道,80端口是web服務的默認端口,其他主機訪問web服務器也是默認和80端口進行web交互,而一台服務器也只有一個80端口,這是約定俗成的標準.

我們來看下面兩個場景:

 1.服務器的80端口被佔用,我們想實現服務器的其他端口(比如port:2368)web服務.

 2.我們想在一台服務器上實現多個站點的web服務.

要解決這個問題,需要用到反向代理,下面的小對話可能更容易理解反向代理這個概念:

—————————————————-

主機H:我給你發一個http get請求,IP分組部分信息為:

    a.我訪問的域名(解析前的域名,如:www.domain.com.

    b.我要訪問的IPwww.domain.com域名解析後的公網IP.

服務器Sweb服務程序收到IP分組後,先把這個IP分組丟給nginx(或Apache反向代理服務)看,nginx拿到IP分組後根據a.要訪問的域名來檢查配置文件,看是否需要轉其他端口.例如:配置文件裡面有這樣的描述:

    如果這個分組的awww.domain1.com,那麼轉到2368端口;

    如果這個分組的awww.domain2.com,那麼轉到1243端口;

    如果這個分組的awww.domain3.com,那麼轉到2104端口;

    否則就用80端口.

web服務程序照做,把相應端口的數據傳給主機H.

—————————————————-

通俗的說,就是:服務器根據主機來訪域名區分需要轉哪個端口.

利用上面的配置,我們就可以實現在一台服務器上建立4web服務站點.

.如何實現

實現反向代理一般有兩種方法:

1.Apache反向代理服務

2.nginx反向代理服務

其中nginx在負載均衡這方面比Apache更專業,小巧專一,很是優雅.

nginx反向代理的具體操作如下:

安裝nginx

RedHat為例

1.下載介質

   nginx部署之前,首先根據項目的需要選擇需要安裝的組件,實際環境一般會考慮需要支持gzip壓縮和rewrite模塊,所以安裝的第一步是下載NgixNgix的相關組件.

1) nginx本身

   下載地址:http://nginx.org/en/download.html

   建議下載最新版本介質,目前最新的是:1.9.9

2) gzip壓縮依賴庫:zlib

   下載地址:http://www.zlib.net

   下載版本:Version 1.2.5

3)Rewrite模塊的正則表達式依賴庫:pcre

   pcre庫簡稱:Perl兼容正則表達式

   下載地址:http://www.pcre.org

   下載版本:pcre-8.38

2.開始安裝

1) .安裝 pcre

tar -zxvf pcre-8.02.tar.gz

./configure

make

make install

默認安裝到/usr/local/lib下即可,安裝完成後可以#ls -l /usr/local/lib/libpcre.so

2.安裝nginx

tar zxvf nginx-1.0.11.tar.gz

cd nginx-1.0.11

./configure –prefix=/usr/local/nginx –with-poll_module –with-http_stub_status_module

make && make install

3 .配置nginx

安裝完成之後,配置目錄conf下有以下配置文件,過濾掉xx.default配置:

tyler@Ubuntu:/opt/nginx-1.7.7/conf$ tree |grep -v default

.

├── fastcgi.conf

├── fastcgi_params

├── koi-utf

├── koi-win

├── mime.types

├── nginx.conf

├── scgi_params

├── uwsgi_params

└── win-utf

nginx.conf,其餘配置文件,一般只需要使用默認提供即可.

nginx.conf

nginx.conf是主配置文件,默認配置去掉注釋之後的內容如下圖所示:

l  worker_process表示工作進程的數量,一般設置為cpu的核數

l  worker_connections表示每個工作進程的最大連接數

l  server{}塊定義虛擬主機

n  listener監聽端口

n  server_name監聽域名

n  location{}是用來為匹配的 URI 進行配置,URI 即語法中的“/uri/”,location  / { }匹配任何查詢,因為所有請求都以 / 開頭.

u  root指定對應uri的資源查找路徑,這裡html為相對路徑,完整路徑為/opt/ opt/nginx-1.7.7/html/

u  index指定首頁index文件的名稱,可以配置多個,以空格分開。如有多個,按配置順序查找.


從配置可以看出,nginx監聽80端口、域名為localhost、跟路徑為html文件夾(我的安裝路徑為/opt/nginx-1.7.7,所以/opt/nginx-1.7.7/html)、默認index文件為index.html index.htm、服務器錯誤重定向到50x.html頁面。

可以看到/opt/nginx-1.7.7/html/有以下文件:

tyler@ubuntu:/opt/nginx-1.7.7/html$ ls

50x.html index.html

這也是上面在瀏覽器中輸入http://localhost,能夠顯示歡迎頁面的原因。實際上訪問的是/opt/nginx-1.7.7/html/index.html文件.

mime.types

文件擴展名與文件類型映射表,nginx根據映射關係,設置http請求響應頭的Content-Type.

當在映射表找不到時,使用nginx.confdefault-type指定的默認值。例如,默認配置中的指定的default-typeapplication/octet-stream.

include mime.types;

default_type application/octet-stream;

下面截一段mime.types定義的文件擴展名與文件類型映射關係,完整的請自行查看:


fastcgi_params

nginx配置Fastcgi解析時會調用fastcgi_params配置文件來傳遞服務器變量,這樣CGI中可以獲取到這些變量的值。默認傳遞以下變量:


這些變量的作用從其命名可以看出.

2.4.fastcgi.conf

對比下fastcgi.conffastcgi_params文件,可以看出只有以下差異:

tyler@ubuntu:/opt/nginx-1.7.7/conf$ diff fastcgi.conf fastcgi_params 2d1

< fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi.conf只比fastcgi_params多一行“fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;”

原本只有fastcgi_params文件,fastcgi.confnginx 0.8.30 (released: 15th of December 2009)才引入的.

原本nginx只有fastcgi_params,後來發現很多人在定義SCRIPT_FILENAME時使用硬編碼的方式。例如,fastcgi_param SCRIPT_FILENAME

/var/www/foo$fastcgi_script_name。於是為規範用法便引入fastcgi.conf

不過這樣的話就產生一個疑問:為什麼一定要引入一個新的配置文件,而不是修改舊的配置文件?

這是因為fastcgi_param指令是數組型的,和普通指令相同的是:內層替換外層;和普通指令不同的是:當在同級多次使用的時候,是新增而不是替換.

換句話說,如果在同級定義兩次SCRIPT_FILENAME,那麼它們都會被發送到後端,這可能會導致一些潛在的問題,為避免此類情況,便引入一個新的配置文件。

因此不再建議大家使用以下方式(搜一下,網上大量的文章,並且nginx.conf的默認配置也是使用這種方式):

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

而使用最新的方式:

include fastcgi.conf;

uwsgi_params

fastcgi_params一樣,傳遞哪些服務器變量,只有前綴不一樣,以uwsgi_param開始而非fastcgi_param.

scgi_params

fastcgi_params一樣,傳遞哪些服務器變量,只有前綴不一樣,以uwsgi_param開始而非fastcgi_param.

koi-utfkoi-winwin-utf

這三個文件都是與編碼轉換映射文件,用於在輸出內容到客戶端時,將一種編碼轉換到另一種編碼。

koi-win: charset_map koi8-r < — > windows-1251

koi-utf: charset_map koi8-r < — > utf-8

win-utf: charset_map windows-1251 < — > utf-8

4.管理nginx服務

啟動:

/usr/local/nginx/sbin/nginx

停止

/usr/local/nginx/sbin/nginx -s stop

重啟

/usr/local/nginx/sbin/nginx -s reload

查看狀態

netstat -autlp| grep nginx

.nginx開機自啟

實現:編寫shell腳本,並把shell腳本啟動命令加到系統自啟名單.

vi /etc/init.d/nginx  (輸入下面的代碼)

#!/bin/bash

# nginx Startup script for the nginx HTTP Server

# it is v.0.0.2 version.

# chkconfig: – 85 15

# description: nginx is a high-performance web and proxy server.

# It has a lot of features, but it’s not for everyone.

# processname: nginx

# pidfile: /var/run/nginx.pid

# config: /usr/local/nginx/conf/nginx.conf

nginxd=/usr/local/nginx/sbin/nginx

nginx_config=/usr/local/nginx/conf/nginx.conf

nginx_pid=/var/run/nginx.pid

RETVAL=0

prog=”nginx”

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

[ ${NETWORKING} = “no” ] && exit 0

[ -x $nginxd ] || exit 0

# Start nginx daemons functions.

start() {

if [ -e $nginx_pid ];then

echo “nginx already running….”

exit 1

fi

echo -n $”Starting $prog: ”

daemon $nginxd -c ${nginx_config}

RETVAL=$?

echo

[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx

return $RETVAL

}

# Stop nginx daemons functions.

stop() {

echo -n $”Stopping $prog: ”

killproc $nginxd

RETVAL=$?

echo

[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid

}

# reload nginx service functions.

reload() {

echo -n $”Reloading $prog: ”

#kill -HUP `cat ${nginx_pid}`

killproc $nginxd -HUP

RETVAL=$?

echo

}

# See how we were called.

case “$1” in

start)

start

;;

stop)

stop

;;

reload)

reload

;;

restart)

stop

start

;;

status)

status $prog

RETVAL=$?

;;

*)

echo $”Usage: $prog {start|stop|restart|reload|status|help}”

exit 1

esac

exit $RETVAL

 :wq  保存並退出

設置文件的權限:

chmod a+x /etc/init.d/nginx

這樣在控制台就很容易的操作nginx:查看nginx當前狀態、啟動nginx、停止nginx、重啟nginx…

 同樣的修改nginx的配置文件nginx.conf,也可以使用上面的命令重新加載新的配置文件並運行,可以將此命令加入到rc.local文件中,這樣開機的時候nginx就默認啟動

vi /etc/rc.local

加入一行  /etc/init.d/nginx start  保存並退出,下次重啟會生效。

以下文章點擊率最高

Loading…

     

如果這文章對你有幫助,請掃左上角微信支付-支付寶,給於打賞,以助博客運營