NGINX2

nginx的地址重定向,代理,調度(調度算法),和源碼編譯;

nginx的源碼編譯:

1 . 下載源碼包:http://nginx.org/en/download.html

2 .構建配置環境:(安裝編譯所需要的包)

yum groupinstall “development tools”

yum install pcre-devel openssl-devel zlib-devel

mkdir /app ? (新建文件夾供nginx的安裝時用)

useradd -r nginx(創建nginx用戶賬號)

3 .將下載的源碼上傳到Linux系統里:并解壓縮。

tar -xvf nginx-1.12.2.tar.gz

cd nginx-1.12.2 ? (進入到解壓后的文件夾里)

4. 修改nginx的源碼參數:(可以不用修改,此處僅為了更改nginx的服務名而已)

cd ? /root/nginx-1.12.2/src/http

vim ngx_http_header_filter_module.c

QQ截圖20180706200440

cd ? /root/nginx-1.12.2/src

vim nginx.h

QQ截圖20180706200440

 

5.開始編譯:

cd?/root/nginx-1.12.2

./configure –prefix=/app/nginx \ ?? (指定的安裝路徑)
–conf-path=/etc/nginx/nginx.conf \ ? ?? (指定的配置文件的路徑)
–error-log-path=/var/log/nginx/error.log \ ?? (指定的錯誤日志文件的路徑)
–http-log-path=/var/log/nginx/access.log \ ? ? (指定訪問日志的文件路徑)
–pid-path=/var/run/nginx.pid \ ? ? ? ? (指定運行程序的路徑)
–lock-path=/var/run/nginx.lock \
–user=nginx –group=nginx \ ? ? ? ? ? ? ?? (指定用戶)
–with-http_ssl_module \ ? ? ? ? ? ? ? ? ? ? ?? (以下都是指定要編譯的模塊)
–with-http_v2_module \
–with-http_dav_module \
–with-http_stub_status_module \
–with-threads –with-file-aio

QQ截圖20180706201742

6 . make -j 4 && make install

7 . 將nginx的運行程序的路徑添加到PATH變量? /app/nginx/sbin

8 ./app/nginx/html? (編譯安裝后的主頁面路徑)

9. ?curl -I 192.168.60.20(在另一臺客戶端訪問可以發現主機頭部的服務名稱已經改變了)

QQ截圖20180706205046

總結:如果需要添加加自己的配置文件例如:/etc/nginx/conf.d/*.conf

則需要將此路徑添加到主配置文件里:include ? /etc/nginx/conf.d/*.conf;具體添加到何處可以參考yum安裝的生成的主配置文件里的寫法。

 

ngx_http_rewrite_module (地址重定向模塊)

last:重寫完成后停止對當前URI在當前location中后續的其它重寫操作, 而后對新的URI啟動新一輪重寫檢查;提前重啟新一輪循環,不建議在location中 使用

break:重寫完成后停止對當前URI在當前location中后續的其它重寫操作, 而后直接跳轉至重寫規則配置塊之后的其它配置;結束循環,建議在location中使 用?

redirect:臨時重定向,重寫完成后以臨時重定向方式直接返回重寫后生成 的新URI給客戶端,由客戶端重新發起請求;使用相對路徑,或者http://或https:// 開頭,狀態碼:302

permanent:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給 客戶端,由客戶端重新發起請求,狀態碼:301

注意:

如果在同一級配置塊中存在多個rewrite規則,那么會自下而下逐個 檢查;被某條件規則替換完成后,會重新一輪的替換檢查

隱含有循環機制,但不超過10次;如果超過,提示500響應碼,[flag]所表示 的標志位用于控制此循環機制

如果replacement是以http://或https://開頭,則替換結果會直接以重向返 回給客戶端, 即永久重定向301

示例1:

location /bbs? {
? ? ? ? ? ?? rewrite ^/bbs/(.*)$ ? ? ? /forum/$1 ? ? break; ? ? ($1就是(.*)里的內容)

上條的意思就是:當用戶訪問根目錄下的/bbs/下的(.*)內容時就會跳轉到/forum/下的(.*)的內容

bbs和forum都在同一個目錄下既在定義的root ? /data/test1/(主頁面目錄下)

測試:在 /data/test1/下新建兩個文件夾并寫入內容:

mkdir bbs forum

echo bbs > bbs/index.html
echo forum > forum/index.html

QQ截圖20180707113148

此時訪問:www.a.com/bbs/ ?? (應該是顯示forum目錄下的內容;bbs目錄下可以沒有任何內容,此目錄也可以不存在,他只是url路徑而已并且被重定向到forum目錄下的內容了)

示例2:(當訪問一個網站是不加密的時候跳轉到加密的網站;背后是有兩個虛擬主機網站的)要實現加密還需要去申請和頒發證書文件才行。

location / ? {
rewrite / ? https://www.a.com/ ? redirect; (當訪問源網站的根時 就跳轉到新的https的網站的根上去;采用臨時跳轉)

示例3:(當訪問一個網站是不加密的時候跳轉到加密的網站;背后只有一個虛擬主機網站)

 

QQ截圖20180707141150

示例4:(實現動靜態頁面的分離)

當訪問靜態頁面時(如,圖片.文檔)則跳轉到一個路徑下;當訪問動態資源時(如;php程序)則跳轉到另一個路徑下:

QQ截圖20180707143019

例如在;/data/test1/下新建一個pp.html的文件

curl? www.a.com/pp.txt ? (就會顯示pp.html文件里的內容)因為上面定義了只要訪問(.*).txt 就會跳轉到$1.html的文件里? 其中$1=(.*)

ngx_http_referer_module? (防盜鏈模塊)

QQ截圖20180707151814

QQ截圖20180707152128

如果不是從這幾個地方訪問的就給與拒絕;返回403;

 

nginx的代理

實驗1;實現簡單的代理轉發:

新建位圖圖像

1. 在后端的web服務器上安裝http服務并開啟服務。

2 .在nginx代理服務器上;

首先安裝nginx服務;然后修改配置文件在單個的自配置文件里

/etc/nginx/conf.d/test1.conf

QQ截圖20180707160417

在客戶端直接curl 172.20.49.2(此地址為nginx服務器的橋接網卡的地址)就會轉到后臺的http服務器上。

在上述實驗的基礎上實現:對特定url的名稱的跳轉:

QQ截圖20180707170639

 

上述配置文件:當訪問nginx代理服務器的具體路徑時,會轉發到后臺服務器的/forum/下的文件夾

需要在后臺服務器的主頁面下新建一個/var/www/html/forum/index.html文件,

http://172.20.49.2/bbs/ ? (在瀏覽器上訪問)

curl -L 172.20.49.2/bbs/ ? (使用curl來訪問)

如果將后端服務器的端口號改成8080的情況下

只需要修改代理服務器的端口就可以了。如下圖配置:

QQ截圖20180707171502

 

上述實驗是只要訪問服務器的IP地址就都代理走,現在要實現只針對/bbs才轉發到后臺的服務器上;配置如下:

QQ截圖20180707172445

當上圖的設置并不是在訪問nginx的IP地址curl -L 172.20.49.2/bbs/時就會將其轉到192.168.60.4后端服務器的主頁面上,而是將其轉到后端服務器主頁面上的/var/www/html/bbs目錄下的。

如果要轉到后臺服務器的根下,則如下面的配置:(IP地址后面多了個/號)

QQ截圖20180707173134

總結:如果后臺服務器的IP地址最后不添加/號,則是代理到后臺服務器相同的文件目錄下(置換url路徑)

如果添加/號則代理到后臺服務器的主頁面下

 

 

實驗2 :實現靜態和動態頁面轉發到后臺不同的服務器上。

新建位圖圖像

1 . 在nginx代理服務器上進行設置:

yum install nginx (安裝nginx服務)

vim /etc/nginx/conf.d/test1.conf (創建配置文件)

QQ截圖20180707200146

nginx -s reload? (重新加載配置文件)

nginx ?? (開啟服務)

http://172.20.49.2/index.html ? (在瀏覽器上訪問靜態頁面,就會被調度到靜態web服務器上去了)

http://172.20.49.2/test.php ? ? ?? (在瀏覽器上訪問動態界面,就會被調度到動態web服務器上去了)

 

2 . 在http-php動態主機服務器上:

yum install php-fpm php-mysql ? (安裝php包和連接數據庫的包)

systemctl start php-fpm ? (啟動php-fpm服務)由于是和http服務器在同一臺機器上,所以php-fpm的配置文件不需要更改。

yum install httpd (安裝HTTP服務)

vim /etc/httpd/conf.d/php.conf(創建配置文件讓php的程序能夠在http下運行)

DirectoryIndex index.php ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1

創建連接數據庫的測試代碼:
vim /var/www/html/test.php

<?php
$dsn=’mysql:host=192.168.60.22;dbname=test’;
$username=’test’;
$passwd=’centos’;
$dbh=new
PDO($dsn,$username,$passwd);
var_dump($dbh);
?>

systemctl start httpd ? (啟動http服務)

3 . 在靜態的web服務器上進行設置:

yum install httpd (安裝HTTP服務)

echo stainpage > /var/www/html/index.html? (建立靜態服務器的主頁面)

systemctl restart httpd ? (重啟服務)

4 . 在數據庫的服務器主機上:

yum install mariadb-server ? (安裝數據庫服務)

grant all on *.* to test@’192.168.60.%’ identified by ‘centos’; (在數據庫中創建連接前端web服務器的用戶賬號)

 

上述實驗中在后端服務器上的日志里記錄的是nginx服務器訪問的地址無法看到真實的客戶端訪問的IP地址。

解決辦法;在數據報文頭部添加新的字段。(在nginx代理服務器的配置文件里添加一行命令)

server {
listen 80 default_server;
server_name www.a.com;
root /data/test1/;
location ~ \.php$ {
proxy_pass http://192.168.60.21;
}
location / {
proxy_set_header remoyeclient $remote_addr; (在此添加此行命令,在192.168.60.20的日志里就會)
proxy_pass http://192.168.60.20; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (看到來自客戶端訪問的IP地址了;加在此處只對)
} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (60.20的靜態web服務器有效,如果想要動態的web)

} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (服務器也可以看到客戶端的IP地址在上面也添加)

remoyeclient (此字段可以由自己隨便定義)

還需要在后臺靜態的web服務器上修改http的日志格式;

vim /etc/httpd/conf/httpd.conf

QQ截圖20180707212252

最后再次查看靜態web服務器的http日志就能發現客戶端訪問的IP地址了。

 

 

實驗將nginx代理服務器的緩存共能開啟;

新建位圖圖像

 

當客戶端訪問后端web服務器數據時,nginx代理服務器如果啟用緩存,則直接將數據提供給客戶端,提高了 訪問的速度。(速度一般會快到2倍左右)

1 . 首先新建nginx的緩存目錄:

mkdir /var/cache/nginx

2 .修改配置文件;(此選項要添加在nginx的主配置文件里的http的語句塊里)

proxy_cache_path path /var/cache/nginx/proxy_cache levels=1:1:1

keys_zone=proxycache:20m

inactive=120s? max_size=1g;

說明:(levels=1:1:1 緩存的三級文件夾;/var/cache/nginx/緩存存放的路徑)

proxycache:20m 指內存中緩存的大小,主要用于存放key和metadata (如:使用次數和url名稱)(對應文件的名稱哈希值算法的鍵值對)max_size=1g 指磁盤存入文件內容的緩存空間最大值

 

QQ截圖20180708153106

3 . 調用緩存功能,需要定義在相應的配置段,如server{…}; 在虛擬主機的配置文件里添加

proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;

QQ截圖20180708153323

此時在客戶端再次訪問就會在:/var/cache/nginx/文件夾下生成緩存文件:每個緩存文件為三級目錄結構。

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off … 在被代理的后端服務器出現哪種情況下,可以真接使用過期的緩存響應客戶 端 ?

10、proxy_connect_timeout time;

定義與后端服務器建立連接的超時時長,如超時會出現502錯誤,默認為 60s,一般不建議超出75s

11、proxy_send_timeout time;

將請求發送給后端服務器的超時時長;默認為60s

12、proxy_read_timeout time;

等待后端服務器發送響應報文的超時時長,默認為60s

 

 

 

ngx_http_fastcgi_module

轉發請求到FastCGI服務器,不支持php模塊方式

1、fastcgi_pass address;

address為后端的fastcgi server的地址

可用位置:location, if in location

2、fastcgi_index name;

fastcgi默認的主頁資源 示例:

fastcgi_index index.php;

3、fastcgi_param parameter value [if_not_empty];

設置傳遞給 FastCGI服務器的參數值,可以是文本,變量或組合

 

實驗:基于fastcgi實現nginx的lnmp服務

結構拓撲圖:

新建位圖圖像

1 . 在ngix服務器上:

yum install nginx? (安裝nginx服務)

vim /etc/nginx/conf.d/test1.conf ?? (修改虛擬主機的配置文件)

fastcgi_pass 192.168.60.21:9000; ? ? ? (指定php服務器的的IP地址和端口號)
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/php$fastcgi_script_name; (指定php程序存放的路徑;目錄在)
include fastcgi_params; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? (php服務器上已經創建好了)

QQ截圖20180708170210

重新啟動nginx服務就可以了

2 . 在php服務器上:

yum install php-fpm php-mysql (安裝php包和連接數據庫的包)
systemctl start php-fpm (啟動php-fpm服務)由于是和http服務器在同一臺機器上,所以php-fpm的配置文件不需要更改。

vim /etc/php-fpm.d/www.conf(修改php-fpm的配置文件將監聽端口監聽到nginx服務器上去。)

QQ截圖20180708163438

systemctl restart php-fpm (重新啟動php服務)

mkdir /data/php -p? (新建目錄來存放php程序的主頁面)

創建連接數據庫的測試代碼:
vim /data/php/test.php
<?php
$dsn=’mysql:host=192.168.60.22;dbname=test’;
$username=’test’;
$passwd=’centos’;
$dbh=new
PDO($dsn,$username,$passwd);
var_dump($dbh);
?>

3 . 在數據庫的機器上:

yum install mariadb-server (安裝數據庫服務)
grant all on *.* to test@’192.168.60.%’ identified by ‘centos’; (在數據庫中創建連接前端web服務器的用戶賬號)

4 . 在客戶端訪問:http://172.20.20.2/test.php? 就可以了

 

小記:在fscgi上也可以實現緩存,來提高訪問速度,具體在43天的視頻里。

 

 

 

ngx_http_upstream_module(調度算法模塊)

nginx作為轉發服務器可以自動的檢測后臺服務器的健康狀態,如果后臺的web服務器宕機了,nginx就不會再轉發到后臺宕機的服務器上去了。

1 ?? 默認調度算法是rr ,如果沒添加權重的話;

2? 如果在后面加上權重的話就變成wrr算法。

3、ip_hash

源地址hash調度方法

4、least_conn

最少連接調度算法,當server擁有不同的權重時其為wlc, 當所有后端主機連接數相同時,則使用wrr,適用于長連接

5、hash key [consistent]

基于指定的key的hash表來實現對請求的調度, 此處的key可以直接文本、變量或二者組合

作用:將請求分類,同一類請求將發往同一個upstream server,使用 consistent參數,將使用ketama一致性hash算法,適用于后端是Cache服務器 (如varnish)時使用

hash $request_uri consistent; ? (只要訪問某一個固uri路徑就向固定的一個地方來調度;如訪問www.a.com /test1.html 不論你來自于哪個用戶只要訪問此test1.html就向某個固定的服務器上調度

此種方法的好處是配合后臺的緩存服務器來使用;后臺的緩存服務器“varnish”存在于調度器和web服務其之間來緩存用戶的訪問后臺web服務器上的數據;如果緩存上有就無需再向后臺web服務器上去調用,大大的提高了訪問的速度。如下圖所示:

新建位圖圖像

當客戶端只要訪問1.html的url時就調度到第一個緩存服務器上,之后再調度到后端的web服務器上,再第二此訪問時,緩存服務器上就有了數據,無需從web上再次讀取,直接從緩存服務器上調取數據,大大提高了訪問的速度。(任意用戶只要訪問1.html都會向第一個緩存服務器上調度)

 

 

hash $remote_addr;

(其中一致性的哈希算法:)服務器中有一個哈希環,大小為2^32大小,然后對每個后臺web服務器的IP地址做哈希值計算然后取模,取模后的數字代表此后端服務器,每個后端服務器取模后的值放在哈希環上,客戶端訪問時,也將客戶端的IP地址哈希取模,然后將其放在哈希環上,順時針訪問離自己最近的web服務器的主機。(當后端主機數量較少時??赡軙购蠖朔掌鞫继幱诠-h的一側,導致哈希環偏離,這時系統會自動的將原來的后端服務器的IP地址按權重,乘以100,將每個web的服務器都放大到100倍的數量,在做哈希值的運算將其放到哈希環上就不會導致哈希環的偏離了)

 

 

實驗:實現使用nginx來實現前臺的調度:

實驗結構拓撲圖:

新建位圖圖像

1 . 在nginx調度服務器上:

yum install nginx? (安裝包)

nginx? (啟動服務)

vim /etc/nginx/nginx.conf? (修改主配置文件)

upstream www {
server 192.168.60.21;
server 192.168.60.20;

}

QQ截圖20180708181425

vim /etc/nginx/conf.d/test1.conf

location / {
proxy_pass http://www; (當訪問本機的根時,給他轉發到www上去www來自前面主配置文件里定義的)

QQ截圖20180708181001

2. 在后端的兩臺web服務器上:

RS1:

安裝http服務:

yum install httpd? (安裝包)

echo RS1 > /var/www/html/index.html ? (創建主頁面)

systemctl start httpd (啟動服務)

RS2:
安裝http服務:
yum install httpd (安裝包)
echo RS2 > /var/www/html/index.html (創建主頁面)
systemctl start httpd (啟動服務)

3 . 在客戶端訪問:curl www.a.com? / curl 172.20.20.22(就可以實現后臺兩臺web服務器的調度了)

小結:nginx作為轉發的服務器,能夠實現健康性檢查,當后臺的服務器宕機了,就不會調度到宕機的服務器上去了,如果恢復了,就會自動的添加到調度表里去。

 

當端口號不同時也能實現調度任務。

將后臺的一臺web服務器的端口號改為8080;

然后需要修改;主配置文件也做相應的端口號更改。

upstream www {
server 192.168.60.21:8800; ?? (添加8800就可以了,不寫的話默認使用的是80端口號)
server 192.168.60.20;

其他的功能介紹:

server 192.168.60.4?weight=2; ? (加權重2;不寫權重默認為1)

server 192.168.60.4 ? max_conns? 10000; ? (連接后端報務器最大并發活動連接數,1.11.5版本后支持 )

server 192.168.60.4 max_fails=3; ? (失敗嘗試最大次數;超出此處指定的次數時,server將被標 記為不可用,默認為1 )

server 192.168.60.4 fail_timeout=20s; ? (后端服務器標記為不可用狀態的連接超時時長,默認10s )

server 192.168.60.4 backup; ? ? ? ? (將服務器標記為“備用”,即所有服務器均不可用時才啟用 )

server 192.168.60.4? down; ? ? ? ? ?? (標記為“不可用”,配合ip_hash使用,實現灰度發布 )

調度算法的更改:(添加到下面的位置)

QQ截圖20180708194447

ip_hash ? ? ? ? 源地址hash調度方法

least_conn ? ? 最少連接調度算法(上文有詳細的解釋)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/102344

(0)
無所謂無所謂
上一篇 2018-07-06
下一篇 2018-07-07

相關推薦

  • chmod 大寫X

    大寫執行權限X,加了怎么不顯示呢

    2018-04-09
  • Linux上的文件管理類命令

    常用的文件目錄管理命令:cd,pwd,ls,mkdir,rmdir,tree,more,less,head,tail,cp,mv,rm。 cd命令:改變目錄 后面加絕對或者相對路徑 命令格式:cd [options] [Dirname] [Azuth@azuth ~]$ cd /home/Azuth[Azuth@azuth ~]$ pwd/home/Azut…

    Linux筆記 2018-05-20
  • Linux基礎知識

    Linux是什么? 想要了解linux,我們就需要先介紹一下計算機。什么是計算機?計算機的功能和組成部分? 計算機是什么呢?它是一種能接收和存儲信息 ,并按照存儲在其內部的程序對海量數據進行自動、高速地 處理,然后把處理結果輸出的現代化智能電子設備。 它的基本功能就是接收用戶輸入的指令,通過CPU的數學與邏輯單元運算處理后,產生或者存儲成有用的信息。 計算機…

    2018-05-10
  • 路由

    地址分類有類的 固定的網絡ID 是多少位就是多少位A 前8位是網絡ID0-127.x.x.x其中0.x.x.x是未知地址,不能用127.x.x.x是回環地址,不能用所以有1-126個網段可用公式:網絡(網段)數量=2^可變網絡ID位數一個網絡的主機數量=2^主機ID位數-2所以一個A類網絡主機數有1600萬netmask:255.0.0.0 B類128-19…

    Linux筆記 2018-05-06
欧美性久久久久