咱們都知道,80端口是web服務的默認端口,其餘主機訪問web服務器也是默認和80端口進行web交互,而一臺服務器也只有一個80端口,這是約定俗成的標準.html
咱們來看下面兩個場景:nginx
1.服務器的80端口被佔用了,咱們想實現服務器的其餘端口(好比port:2368)web服務.web
2.咱們想在一臺服務器上實現多個站點的web服務.正則表達式
要解決這個問題,須要用到反向代理,下面的小對話可能更容易理解‘反向代理’這個概念shell
主機H:我給你發了一個http get請求,IP分組部分信息爲:ubuntu
a.我訪問的域名(解析前的域名,如:www.domain.com).windows
b.我要訪問的IP(www.domain.com域名解析後的公網IP).後端
服務器S的web服務程序收到IP分組後,先把這個IP分組丟給nginx(或Apache反向代理服務)看,nginx拿到IP分組後根據a.要訪問的域名來檢查配置文件,看是否須要轉其餘端口.例如:配置文件裏面有這樣的描述:數組
若是這個分組的a是www.domain1.com,那麼轉到2368端口;瀏覽器
若是這個分組的a是www.domain2.com,那麼轉到1243端口;
若是這個分組的a是www.domain3.com,那麼轉到2104端口;
不然就用80端口.
web服務程序照作,把相應端口的數據傳給主機H.
通俗的說,就是:服務器根據主機來訪域名區分須要轉哪一個端口.
利用上面的配置,咱們就能夠實如今一臺服務器上創建4個web服務站點.
實現反向代理通常有兩種方法:
1.Apache反向代理服務
2.nginx反向代理服務
其中nginx在負載均衡這方面比Apache更專業,小巧專注,非常優雅.
nginx反向代理的具體操做以下:
安裝nginx
以RedHat爲例
1.下載介質
nginx部署以前,首先根據項目的須要選擇須要安裝的組件,實際環境通常會考慮須要支持gzip壓縮和rewrite模塊,因此安裝的第一步是下載Ngix及Ngix的相關組件.
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監聽了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文件.
文件擴展名與文件類型映射表,nginx根據映射關係,設置http請求響應頭的Content-Type值.
當在映射表找不到時,使用nginx.conf中default-type指定的默認值。例如,默認配置中的指定的default-type爲application/octet-stream.
include mime.types;
default_type application/octet-stream;
下面截一段mime.types定義的文件擴展名與文件類型映射關係,完整的請自行查看:
nginx配置Fastcgi解析時會調用fastcgi_params配置文件來傳遞服務器變量,這樣CGI中能夠獲取到這些變量的值。默認傳遞如下變量:
這些變量的做用從其命名能夠看出.
對比下fastcgi.conf與fastcgi_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.conf是nginx 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;
與fastcgi_params同樣,傳遞哪些服務器變量,只有前綴不同,以uwsgi_param開始而非fastcgi_param.
與fastcgi_params同樣,傳遞哪些服務器變量,只有前綴不同,以uwsgi_param開始而非fastcgi_param.
這三個文件都是與編碼轉換映射文件,用於在輸出內容到客戶端時,將一種編碼轉換到另外一種編碼。
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
實現:編寫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 保存並退出,下次重啓會生效。