日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

代理服务器Tengine的研究与测试

發(fā)布時(shí)間:2025/3/8 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 代理服务器Tengine的研究与测试 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

代理服務(wù)器Tengine的研究與測(cè)試

一、Tengine介紹

1.首先要知道什么Nginx

1)Nginx(發(fā)音同 engine x)是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計(jì)師Igor Sysoev所開(kāi)發(fā),最初供俄國(guó)大型的入口網(wǎng)站及搜尋引擎Rambler(俄文:Рамблер)使用。 其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力確實(shí)在同類型的網(wǎng)頁(yè)伺服器中表現(xiàn)較好.目前中國(guó)大陸使用nginx網(wǎng)站用戶有:新浪、網(wǎng)易、 騰訊,另外知名的微網(wǎng)志Plurk也使用nginx


2.Nginx優(yōu)點(diǎn)

1)Nginx 可以在大多數(shù) Unix like OS 上編譯運(yùn)行,并有 Windows 移植版。 Nginx 的1.2.6穩(wěn)定版已經(jīng)于2012年12月11日發(fā)布,[1]1.3.10開(kāi)發(fā)版已經(jīng)于2012年12月25日發(fā)布,如果新建站點(diǎn),建議使用最新穩(wěn)定版作為生產(chǎn)版本,已有站點(diǎn)升級(jí)急迫性不高。Nginx 的源代碼使用 2-clause BSD-like license


2)Nginx 是一個(gè)很強(qiáng)大的高性能Web和反向代理服務(wù)器,它具有很多非常優(yōu)越的特性:在高連接并發(fā)的情況下,Nginx是Apache服務(wù)器不錯(cuò)的替代品:Nginx在美國(guó)是做虛擬主機(jī)生意的老板們經(jīng)常選擇的軟件平臺(tái)之一。能夠支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù)的響應(yīng),感謝Nginx為我們選擇了 epoll and kqueue作為開(kāi)發(fā)模型


3)Nginx作為負(fù)載均衡服務(wù)器:Nginx 既可以在內(nèi)部直接支持 Rails 和 PHP 程序?qū)ν膺M(jìn)行服務(wù),也可以支持作為 HTTP代理服務(wù)器對(duì)外進(jìn)行服務(wù)。Nginx采用C進(jìn)行編寫(xiě),不論是系統(tǒng)資源開(kāi)銷還是CPU使用效率都比 Perlbal 要好很多。

作為郵件代理服務(wù)器:Nginx 同時(shí)也是一個(gè)非常優(yōu)秀的郵件代理服務(wù)器


4) Nginx 是一個(gè)安裝非常的簡(jiǎn)單,配置文件非常簡(jiǎn)潔(還能夠支持perl語(yǔ)法),Bugs非常少的服務(wù)器:Nginx 啟動(dòng)特別容易,并且?guī)缀蹩梢宰龅?*24不間斷運(yùn)行,即使運(yùn)行數(shù)個(gè)月也不需要重新啟動(dòng)。你還能夠不間斷服務(wù)的情況下進(jìn)行軟件版本的升級(jí)


3.Tengine是在Nginx基礎(chǔ)上二次開(kāi)發(fā)而來(lái)


1)Tengine的性能和穩(wěn)定性已經(jīng)在大型的網(wǎng)站如淘寶網(wǎng),天貓商城等得到了很好的檢驗(yàn)。它的最終目標(biāo)是打造一個(gè)高效、穩(wěn)定、安全、易用的Web平臺(tái)。從2011年12月開(kāi)始,Tengine成為一個(gè)開(kāi)源項(xiàng)目。現(xiàn)在,它由Tengine團(tuán)隊(duì)開(kāi)發(fā)和維護(hù)。Tengine團(tuán)隊(duì)的核心成員來(lái)自于淘寶、搜狗等互聯(lián)網(wǎng)企業(yè)。


二、Tengine的功能

1.繼承Nginx-1.2.3 的所有特性,100%兼容Nginx的配置;

2.動(dòng)態(tài)模塊加載(DSO)支持。加入一個(gè)模塊不再需要重新編譯整個(gè)Tengine;

3.輸入過(guò)濾器機(jī)制支持。通過(guò)使用這種機(jī)制Web應(yīng)用防火墻的編寫(xiě)更為方便;

4.動(dòng)態(tài)腳本語(yǔ)言Lua支持。擴(kuò)展功能非常高效簡(jiǎn)單;

5.支持管道(pipe)和syslog(本地和遠(yuǎn)端)形式的日志以及日志抽樣;

6.組合多個(gè)CSS、JavaScript文件的訪問(wèn)請(qǐng)求變成一個(gè)請(qǐng)求;

7.可以對(duì)后端的服務(wù)器進(jìn)行主動(dòng)健康檢查,根據(jù)服務(wù)器狀態(tài)自動(dòng)上線下線;

8.自動(dòng)根據(jù)CPU數(shù)目設(shè)置進(jìn)程個(gè)數(shù)和綁定CPU親緣性;

9.監(jiān)控系統(tǒng)的負(fù)載和資源占用從而對(duì)系統(tǒng)進(jìn)行保護(hù);

10.顯示對(duì)運(yùn)維人員更友好的出錯(cuò)信息,便于定位出錯(cuò)機(jī)器;

11.更強(qiáng)大的防***(訪問(wèn)速度限制)模塊;

12.更方便的命令行參數(shù),如列出編譯的模塊列表、支持的指令等;

13.可以根據(jù)訪問(wèn)文件類型設(shè)置過(guò)期時(shí)間;


三、Tengine-2.1.0主要特性

1.繼承Nginx-1.6.2的所有特性,兼容Nginx的配置;

2.動(dòng)態(tài)模塊加載(DSO)支持。加入一個(gè)模塊不再需要重新編譯整個(gè)Tengine;

3.支持SO_REUSEPORT選項(xiàng),建連性能提升為官方nginx的三倍;

4.支持SPDY v3協(xié)議,自動(dòng)檢測(cè)同一端口的SPDY請(qǐng)求和HTTP請(qǐng)求;

5.流式上傳到HTTP后端服務(wù)器或FastCGI服務(wù)器,大量減少機(jī)器的I/O壓力;

6.更加強(qiáng)大的負(fù)載均衡能力,包括一致性hash模塊、會(huì)話保持模塊,還可以對(duì)后端的服務(wù)器進(jìn)行主動(dòng)健康檢查,根據(jù)服務(wù)器狀態(tài)自動(dòng)上線下線,以及動(dòng)態(tài)解析upstream中出現(xiàn)的域名;

7.輸入過(guò)濾器機(jī)制支持。通過(guò)使用這種機(jī)制Web應(yīng)用防火墻的編寫(xiě)更為方便;

8.支持設(shè)置proxy、memcached、fastcgi、scgi、uwsgi在后端失敗時(shí)的重試次數(shù)

9.動(dòng)態(tài)腳本語(yǔ)言Lua支持。擴(kuò)展功能非常高效簡(jiǎn)單;

10.支持管道(pipe)和syslog(本地和遠(yuǎn)端)形式的日志以及日志抽樣;

11.支持按指定關(guān)鍵字(域名,url等)收集Tengine運(yùn)行狀態(tài);

12.組合多個(gè)CSS、JavaScript文件的訪問(wèn)請(qǐng)求變成一個(gè)請(qǐng)求;

13.自動(dòng)去除空白字符和注釋從而減小頁(yè)面的體積

14.自動(dòng)根據(jù)CPU數(shù)目設(shè)置進(jìn)程個(gè)數(shù)和綁定CPU親緣性;

15.監(jiān)控系統(tǒng)的負(fù)載和資源占用從而對(duì)系統(tǒng)進(jìn)行保護(hù);

16.顯示對(duì)運(yùn)維人員更友好的出錯(cuò)信息,便于定位出錯(cuò)機(jī)器;

17.更強(qiáng)大的防***(訪問(wèn)速度限制)模塊;

18.更方便的命令行參數(shù),如列出編譯的模塊列表、支持的指令等;

19.可以根據(jù)訪問(wèn)文件類型設(shè)置過(guò)期時(shí)間;


四、Tengine版本變更表

1.[2014-03-28] Tengine-2.0.2 開(kāi)發(fā)版正式發(fā)布

2.[2014-03-06] Tengine-2.0.1 開(kāi)發(fā)版正式發(fā)布

3.[2014-01-08] Tengine-2.0.0 開(kāi)發(fā)版正式發(fā)布

4.[2013-11-22] Tengine-1.5.2 穩(wěn)定版正式發(fā)布

5.[2013-08-29] Tengine-1.5.1 穩(wěn)定版正式發(fā)布

6.[2013-07-31] Tengine-1.5.0 穩(wěn)定版正式發(fā)布

7.[2013-05-14] Tengine-1.4.6 開(kāi)發(fā)版正式發(fā)布

8.[2013-05-01] Tengine-1.4.5 開(kāi)發(fā)版正式發(fā)布

9.[2013-03-21] Tengine-1.4.4 開(kāi)發(fā)版正式發(fā)布

10.[2013-01-21] Tengine-1.4.3 開(kāi)發(fā)版正式發(fā)布

11.[2012-11-22] Tengine-1.4.2 開(kāi)發(fā)版正式發(fā)布

12.[2012-10-10] Tengine-1.4.1 開(kāi)發(fā)版正式發(fā)布

13.[2012-09-05] Tengine-1.4.0 開(kāi)發(fā)版正式發(fā)布

14.[2012-05-25] Tengine-1.3.0 穩(wěn)定版正式發(fā)布

15.[2012-05-09] Tengine-1.2.5 穩(wěn)定版正式發(fā)布

16.[2012-03-30] Tengine-1.2.4 穩(wěn)定版正式發(fā)布

17.[2012-02-27] Tengine-1.2.3 穩(wěn)定版正式發(fā)布

18.[2012-01-11] Tengine-1.2.2 穩(wěn)定版正式發(fā)布

19.[2011-12-06] Tengine-1.2.1 版本正式發(fā)布

20.[2011-12-02] Tengine宣布開(kāi)源


五、安裝部署Tengine-2.1.0


1.下載源碼包,解壓縮

wget http://Tengine.taobao.org/download/Tengine-2.1.0.tar.gz

tar zxvf Tengine-2.1.0.tar.gz

cd Tengine-2.1.0


2.看看源碼包的目錄結(jié)構(gòu)

?


默認(rèn)配置文件路徑Tengine-2.1.0/conf

browsers ?fastcgi.conf ?fastcgi_params ?koi-utf ?koi-win ?mime.types ?nginx.conf ?scgi_params ?uwsgi_params ?win-utf


3.正式配置編譯安裝

1)./configure –help ?可以查看編譯幫助選項(xiàng),包括定義軟件路徑,加載模塊,禁用模塊等


2)這里默認(rèn)配置

./configure

配置過(guò)程省略,此過(guò)程當(dāng)中會(huì)檢查系統(tǒng)的各種信息,包括軟件依賴,如果提示缺少編譯工具要提前安裝yum groupinstall "Development Tools",由于默認(rèn)安裝需要加載rewrite重寫(xiě)模塊和ssl安全套接層,所以還有安裝pcre-devel,openssl-devel開(kāi)發(fā)包。

配置過(guò)后會(huì)匯總默認(rèn)安裝文件的路徑如下:

nginx path prefix: "/usr/local/nginx"

? nginx binary file: "/usr/local/nginx/sbin/nginx"

? nginx configuration prefix: "/usr/local/nginx/conf"

? nginx configuration file: "/usr/local/nginx/conf/nginx.conf"

? nginx pid file: "/usr/local/nginx/logs/nginx.pid"

? nginx error log file: "/usr/local/nginx/logs/error.log"

? nginx http access log file: "/usr/local/nginx/logs/access.log"

? nginx http client request body temporary files: "client_body_temp"

? nginx dso module path: "/usr/local/nginx/modules/"

? nginx http proxy temporary files: "proxy_temp"

? nginx http fastcgi temporary files: "fastcgi_temp"

? nginx http uwsgi temporary files: "uwsgi_temp"

? ? ? nginx http scgi temporary files: "scgi_temp"


3) 開(kāi)始編譯安裝

make(make編譯會(huì)把源碼包編譯成二進(jìn)制可執(zhí)行軟件)

make install (會(huì)把編譯好的二進(jìn)制軟件和配置文件復(fù)制到指定的位置)

4) 安裝結(jié)果如下

安裝后到/usr/local/nginx目錄下(默認(rèn)6個(gè)目錄)

conf ?html ?include ?logs ?modules ?sbin

?conf 該目錄下放置了所有的重要配置文件,主要有:fastcgi.conf ?nginx.conf ?proxy.conf ?upstream.conf

?html 目錄默認(rèn)放置的是index.html和50x.html錯(cuò)誤頁(yè)

include 目錄下是模塊文件頭

logs目錄默認(rèn)放置的是訪問(wèn)日志和錯(cuò)誤日志

modules ?目錄下可以放置第三方模塊

sbin 目錄放置的是nginx二進(jìn)制命令和dso_tool


5)檢查nginx命令的用法

A.顯示版本數(shù)

nginx -v

Tengine version: Tengine/2.1.0 (nginx/1.6.2)

B.顯示模塊數(shù)

nginx -m

Tengine version: Tengine/2.1.0 (nginx/1.6.2)

loaded modules:

? ? ngx_core_module (static)

? ? ngx_errlog_module (static)

? ? ngx_conf_module (static)

? ? ……

C.測(cè)試配置文件語(yǔ)法是否正確

nginx -t

the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

configuration file /usr/local/nginx/conf/nginx.conf test is successful

D.啟動(dòng),停止,加載配置文件

-s signal ? ? : send signal to a master process: stop, quit, reopen, reload


六、默認(rèn)配置測(cè)試


1.默認(rèn)啟動(dòng)nginx(用的是nobody用戶)

#/usr/local/nginx/sbin/nginx

#ps aux |grep nginx

root ? ? 24561 ?0.0 ?0.0 ?45280 ?1116 ? ? ? ? ?Ss ? 10:45 ? 0:00 nginx: master process /usr/local/nginx/sbin/nginx

nobody ? 24562 ?0.0 ?0.0 ?45740 ?2112 ? ? ? ? ?S ? ?10:45 ? 0:00 nginx: worker process

#ls /usr/local/nginx (現(xiàn)在11個(gè)目錄,新增了5個(gè)temp)

client_body_temp ?conf ?fastcgi_temp ?html ?include ?logs ?modules ?proxy_temp ?sbin ?scgi_temp ?uwsgi_temp


2.默認(rèn)訪問(wèn)

3.404訪問(wèn)

? ? ? ? ? ? ?


4.Status狀態(tài)訪問(wèn)

?

七、優(yōu)化配置測(cè)試


1.添加www賬號(hào),默認(rèn)使用nobody賬戶運(yùn)行nginx,設(shè)置一個(gè)固定賬戶主進(jìn)程還是root運(yùn)行,worker進(jìn)程是www運(yùn)行

#groupadd -g 58 www

#useradd www -s /sbin/nologin -u 58 -g 58 -M

#id www

uid=58(www) gid=58(www) groups=58(www)


2.優(yōu)化nginx配置


1)可以自動(dòng)識(shí)別cpu進(jìn)程數(shù)并且綁定worker_processes到每個(gè)進(jìn)程上。

worker_processes auto;

為worker_processes增加參數(shù)auto。當(dāng)設(shè)置成auto,Tengine將自動(dòng)啟動(dòng)與cpu數(shù)量相同的worker進(jìn)程。

worker_cpu_affinity on;

當(dāng)設(shè)置成auto時(shí),Tengine將根據(jù)worker的數(shù)量自動(dòng)配置cpu綁定位圖。綁定的順序是按CPU編號(hào)從大到小。


2)修改events區(qū)域

use epoll;#linux系統(tǒng)使用

worker_connections 60000;#默認(rèn)每個(gè)worker連接數(shù)是1024


3)header頭優(yōu)化

client_header_buffer_size 32k;#客戶請(qǐng)求頭緩沖大小

large_client_header_buffers 4 32k; #如果header過(guò)大,它會(huì)使用這個(gè)參數(shù)來(lái)讀取


5)http模塊優(yōu)化

server_tokens off;#錯(cuò)誤頁(yè)面中隱藏Tengine的版本,提高安全性

sendfile on;#高效文件傳輸模式,將tcp_nopush和tcp_nodely設(shè)置為on

tcp_nopush ? ? on;#告訴nginx在一個(gè)數(shù)據(jù)包里發(fā)送所有頭文件

keepalive_timeout 60;#給客戶端分配keep-alive鏈接超時(shí)時(shí)間,這里是60s

tcp_nodelay on;#告訴nginx不要緩存數(shù)據(jù),而是一段一段的發(fā)送--當(dāng)需要及時(shí)發(fā)送數(shù)據(jù)時(shí),就應(yīng)該給應(yīng)用設(shè)置這個(gè)屬性


6)gzip壓縮

? ?gzip on;#開(kāi)啟gzip壓縮 ?實(shí)時(shí)壓縮輸出數(shù)據(jù)流

? ?gzip_min_length ?1k;#最小1K才開(kāi)始?jí)嚎s

? ?gzip_buffers ? ? 4 16k;#壓縮緩存

? ?gzip_http_version 1.1;#壓縮版本

? ?gzip_comp_level 2;#壓縮級(jí)別

? ?gzip_types ? ? ? text/plain application/x-javascript text/css application/xml p_w_picpath/png;#壓縮類型

? ?gzip_vary on;


7)log日志

A.日志格式

log_format ?access ?'$remote_addr - $remote_user [$time_local] "$request" '

? ? ? ? ? ? ? ? ? ? ? '$status $body_bytes_sent $request_time ?"$http_referer" '

? ? ? ? ? ?'"$http_user_agent" "$http_x_forwarded_for" $proxy_add_x_forwarded_for ';

產(chǎn)生的日志格式如下:

訪問(wèn)IP-用戶時(shí)間-請(qǐng)求uri-狀態(tài)-大小-請(qǐng)求時(shí)間-referer-代理IP-真實(shí)IP

61.145.164.198 - - [07/May/2015:13:39:37 +0800] "GET /manager/html HTTP/1.1" 404 590 0.000 ?"-" "Mozilla/3.0 (compatible; Indy Library)" "-" 61.145.164.198

B.日志分割

除了這個(gè)還得對(duì)Tengine產(chǎn)生的大量日志,得進(jìn)行分割才好處理,下面是日志分割腳本:

#!/bin/bash

# This script run at 00:00 to cut nginx_log per day.


logs_path="/data/logs"

log_names=`cd ${logs_path};ls *.log`

year=`date -d "yesterday" +"%Y"`

month=`date -d "yesterday" +"%m"`

time=`date -d "yesterday" +"%Y%m%d"`


/usr/bin/find $logs_path ?-mtime +14 -exec rm -rf {} \;


for log in $log_names

do

? ? mv ${logs_path}/$log ${logs_path}/$log.$time

? ? kill -USR1 `cat /usr/local/nginx/nginx.pid`

done


這個(gè)日志腳本要結(jié)合cron任務(wù)每天凌晨運(yùn)行,日志按天切割,如果需要按其他時(shí)間切割,只需要調(diào)整周期性計(jì)劃任務(wù)即可 ,另外這里是保存二周的日志,注意kil –USR1比nginx –s reload更優(yōu)雅,特別是精確到分鐘時(shí)只能選擇kill –USR1這個(gè)參數(shù)


8) 系統(tǒng)內(nèi)核優(yōu)化(這個(gè)需要結(jié)合實(shí)際服務(wù)器硬件和訪問(wèn)量來(lái)修改)

net.ipv4.ip_forward = 1 ? ? ? ? ? ?#開(kāi)啟路由功能

net.ipv4.conf.default.rp_filter = 1 ? ?#禁用所有IP源路由?

net.ipv4.conf.default.accept_source_route = 0 ? ?#禁用icmp源路由選項(xiàng)

kernel.sysrq = 0 ? ?#關(guān)閉SysRq功能,SysRq代表的是Magic System Request Key

kernel.core_uses_pid = 1 ? ? ?#控制core文件的文件名是否添加pid作為擴(kuò)展?

net.ipv4.tcp_syncookies = 1 ? ?# tcp syncookie,默認(rèn)關(guān)閉

kernel.msgmnb = 65536 #默認(rèn)的每個(gè)消息隊(duì)列的最大尺寸(byte),默認(rèn)為16384

kernel.msgmax = 65536 ? ?#消息隊(duì)列中單條消息的最大尺寸(byte),默認(rèn)8192

kernel.shmmax = 68719476736 ? ?#共享內(nèi)存中的最大內(nèi)存塊尺寸(byte),默認(rèn)33554432(32M),這里是65536M

kernel.shmall = 4294967296 ? #kernel.shmall的單位是頁(yè)面數(shù),當(dāng)前的x86體系上這個(gè)單位是4K,這里是2048G的共享內(nèi)存總量,默認(rèn)2097152

fs.file-max = 6553600 ? ? ? #系統(tǒng)級(jí)最大打開(kāi)文件數(shù),還要結(jié)合limits.conf的soft和hard限制

net.ipv4.tcp_max_tw_buckets = 5000 ? ?#1st低于此值,TCP沒(méi)有內(nèi)存壓力,2nd進(jìn)入內(nèi)存壓力階段,3rdTCP拒絕分配socket(單位:內(nèi)存頁(yè))

net.ipv4.tcp_sack = 1 ? ? ? ? ? ? ? ?#定義SYN重試次數(shù)

net.ipv4.tcp_window_scaling = 1 #開(kāi)啟窗口縮放功能

net.ipv4.tcp_rmem = 4096 ?87380 ?4194304 ? #接受緩沖的大小:MIN,DEFAULT,MAX

net.ipv4.tcp_wmem = 4096 ? ?16384 ? 4194304 ? #socket的發(fā)送緩存區(qū)分配的MIN,DEFAULT,MAX

net.ipv4.tcp_max_syn_backlog = 8192 ? ?#syn隊(duì)列,默認(rèn)1024,> 1280可能工作不穩(wěn)定,需要修改內(nèi)核源碼參數(shù)

net.core.netdev_max_backlog = 32768 ? ?#進(jìn)入包的最大設(shè)備隊(duì)列.默認(rèn)是300,對(duì)重負(fù)載服務(wù)器而言,該值太低,可調(diào)整到2000. ? ? ? ??

net.core.somaxconn = 32768 ? ? ? ? ?#listen()的默認(rèn)參數(shù),掛起請(qǐng)求的最大數(shù)量.默認(rèn)是128.對(duì)繁忙的服務(wù)器,增加該值有助于網(wǎng)絡(luò)性能

net.core.wmem_default = 8388608 ? ? #表示套接字發(fā)送緩沖區(qū)大小的缺省值,會(huì)覆蓋net.ipv4.tcp_wmem的DEFAUL值

net.core.rmem_default = 8388608 ? ? ?#表示套接字接收緩沖區(qū)大小的缺省值

net.core.rmem_max = 16777216 ? ? ? #表示套接字接收緩沖區(qū)大小的最大值

net.core.wmem_max = 16777216 ? ? ?#表示套接字發(fā)送緩沖區(qū)大小的最大值,會(huì)覆蓋net.ipv4.tcp_wmem的MAX值

net.ipv4.tcp_timestamps = 0 ? ? ?#禁用時(shí)間戳,時(shí)間戳可以避免序列號(hào)的卷繞

net.ipv4.tcp_synack_retries = 2 ? #syn-ack握手狀態(tài)重試次數(shù),默認(rèn)5,遭受syn-flood***時(shí)改為1或2

net.ipv4.tcp_syn_retries = 2 ? ? ? #外向syn握手重試次數(shù),默認(rèn)4

net.ipv4.tcp_tw_recycle = 1 ? ? ? #開(kāi)啟 TCP 連接中 TIME-WAIT sockets 的快速回收,默認(rèn)為 0 ,表示關(guān)閉。

net.ipv4.tcp_tw_reuse = 1 ? ? ? ?#開(kāi)啟重用。允許將 TIME-WAIT sockets 重新用于新的 TCP 連接,默認(rèn)為 0 ,表示關(guān)閉;

net.ipv4.tcp_mem = 94500000 915000000 927000000 ?#1低于此值,TCP沒(méi)有內(nèi)存壓力,2在此值下,進(jìn)入內(nèi)存壓力階段,3高于此值,TCP拒絕分配socket.上述內(nèi)存單位是頁(yè)

net.ipv4.tcp_max_orphans = 3276800#選項(xiàng)用于設(shè)定系統(tǒng)中最多有多少個(gè)TCP套接字不被關(guān)聯(lián)到任何一個(gè)用戶文件句柄上,如果超過(guò)這個(gè)數(shù)字,孤立連接將立即被復(fù)位并打印出警告信息

net.ipv4.tcp_fin_timeout = 30 ? ? ? ? ? ? ?#修改系統(tǒng)默認(rèn)的 TIMEOUT 時(shí)間

net.ipv4.tcp_keepalive_time = 300 ? ? ? ? ?#表示當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí),改為5分鐘。

net.ipv4.ip_local_port_range = 1024 ? ?65000 ? ?#表示用于向外連接的端口范圍。缺省情況下過(guò)窄:32768到61000,改為1024到65535。

net.ipv4.ip_conntrack_max = 655360 ? ? ? ? ? ?#增大iptables狀態(tài)跟蹤表

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180 ? ? #設(shè)置默認(rèn) TCP 連接時(shí)長(zhǎng)為180秒


9)為了安全還得開(kāi)啟iptables防火墻

Iptables防火墻策略如下:

cat /etc/sysconfig/iptables

*filter

:INPUT DROP [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

:myinput - [0:0]

:syn-flood - [0:0]

-A INPUT -j myinput?

-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood?

-A myinput -m state --state RELATED,ESTABLISHED -j ACCEPT?

-A myinput -i lo -j ACCEPT?

-A myinput -p tcp -m tcp --dport 80 -j ACCEPT?

-A myinput -p tcp -m tcp --dport 443 -j ACCEPT

-A myinput -s 111.111.111.0/255.255.255.0 -j ACCEPT?

……

-A myinput -i eth2 -j ACCEPT?

-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN?

-A syn-flood -j REJECT --reject-with icmp-port-unreachable?

COMMIT

以上的意思是默認(rèn)DROP所有進(jìn)來(lái)的數(shù)據(jù)包,只允許80和443端口,這個(gè)是提供web服務(wù)的,另外eth2內(nèi)網(wǎng)進(jìn)來(lái)的所有數(shù)據(jù)包都通過(guò),還加了一個(gè)防止小型DDOS***的自定義鏈sys-flood


3.總體配置文件如下

user ?www www;

worker_processes ?auto;

worker_cpu_affinity auto;

error_log ?logs/error.log ?info;

pid ? ? ? ?logs/nginx.pid;

events {

? ? use epoll;

? ? worker_connections 60000;

}

http {

? ? server_names_hash_bucket_size 128;

? ? client_header_buffer_size 32k;

? ? large_client_header_buffers 4 32k;

? ? sendfile on;

? ? ……

? ? gzip on;

? ? ……

? ? include ? ? ? mime.types;

? ? default_type ?application/octet-stream;

log_format ?access?

……

? ? server {

? ? ? ? listen ? ? ? 80;

? ? ? ? server_name ?localhost;

? ? ? ? ……

? ? ? ? location / {

? ? ? ? ? ? root ? html;

? ? ? ? ? ? index ?index.html index.htm;

? ? ? ? }

? ? ? ? error_page ? 500 502 503 504 ?/50x.html;

? ? ? ? location = /50x.html {

? ? ? ? ? ? root ? html;

? ? ? ? }

? ?}

? ? include ?vhosts/*.conf;

? ? include ?upstream.conf;

? ? include ?proxy.conf;?

}

八、結(jié)合線上功能測(cè)試


1.反向代理負(fù)載均衡

1)先了解一下反向代理負(fù)載均衡的概念

使用代理服務(wù)器可以將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部的Web服務(wù)器,使用這種加速模式顯然可以提升靜態(tài)網(wǎng)頁(yè)的訪問(wèn)速度。因此也可以考慮使用這種技術(shù),讓代理服務(wù)器將請(qǐng)求 均勻轉(zhuǎn)發(fā)給多臺(tái)內(nèi)部Web服務(wù)器之一上,從而達(dá)到負(fù)載均衡的目的。這種代理方式與普通的代理方式有所不同,標(biāo)準(zhǔn)代理方式是客戶使用代理訪問(wèn)多個(gè)外部Web 服務(wù)器,而這種代理方式是多個(gè)客戶使用它訪問(wèn)內(nèi)部Web服務(wù)器,因此也被稱為反向代理模式。


2)Tenginx是怎樣實(shí)現(xiàn)這個(gè)功能的

Tenginx使用這個(gè)功能需要2個(gè)模塊ngx_http_proxy_module和ngx_http_upstream_module,ngx_http_proxy_module模塊負(fù)責(zé)反向代理,ngx_http_upstream_module負(fù)載負(fù)載均衡,這兩個(gè)模塊在Tengine默認(rèn)安裝時(shí)就會(huì)


3)Proxy模塊介紹

proxy_redirect off;

proxy_set_header Host $host;#設(shè)定header

proxy_set_header ?X-Real-IP ?$remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ?#獲取客戶端真實(shí)IP

client_max_body_size ? ?20m;#上傳文件大小

client_body_buffer_size 256k;

proxy_connect_timeout ? 60;#代理連接超時(shí)

proxy_send_timeout ? ? ?60;#代理發(fā)送超時(shí)

proxy_read_timeout ? ? ?60;#代理接收超時(shí)

proxy_buffer_size ? ? ? 256k;#代理緩沖大小

proxy_buffers ? ? ? ? ? 4 256k;#代理緩沖

proxy_busy_buffers_size 256k;#高負(fù)荷下緩沖大小

proxy_temp_file_write_size 256k;


4)Upsteam模塊介紹

主要是負(fù)載均衡算法包括:ip_hash、輪詢、加權(quán)輪詢、散列哈希、最短連接數(shù)附加功能有會(huì)話保持、動(dòng)態(tài)域名解析、健康檢查

輪詢:每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動(dòng)剔除

Ip_hash:每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決session的問(wèn)題,但是僅能用ip這個(gè)因子來(lái)分配后端,所以也有缺陷,在下列兩種情況下不可以使用:

A.nginx不是最前端的服務(wù)器。ip_hash要求nginx一定是最前端的服務(wù)器,否則nginx得不到正確ip,就不能根據(jù)ip作hash。譬如使用 的是squid為最前端,那么nginx取ip時(shí)只能得到squid的服務(wù)器ip地址

B.nginx的后端還有其它方式的負(fù)載均衡。假如nginx后端又有其它負(fù)載均衡,將請(qǐng)求又通過(guò)另外的方式分流了,那么某個(gè)客戶端的請(qǐng)求不能定位到同一 臺(tái)session應(yīng)用服務(wù)器上

示例如下:

upstream testcom {

Server 192.168.0.11:80 ?max_fails=2 fail_timeout=10s;

Server 192.168.0.22:80 ?max_fails=2 fail_timeout=10s;

Server 192.168.0.33:80 ?weight=3 max_fails=2 fail_timeout=10s;

Server 192.168.0.11:80 ?down;

Server 192.168.0.22:80 ?backup;

}

down 表示當(dāng)前的server暫時(shí)不參與負(fù)載

weight 默認(rèn)為1.weight越大,負(fù)載的權(quán)重就越大

max_fails :在fail_timeout時(shí)間內(nèi)對(duì)后臺(tái)服務(wù)器請(qǐng)求失敗的次數(shù)

fail_timeout:max_fails次失敗后,暫停的時(shí)間

backup: 其它所有的非backup機(jī)器down或者忙的時(shí)候,請(qǐng)求backup機(jī)器


5)大規(guī)模部署時(shí)注意事項(xiàng)

首先在/usr/local/nginx/conf/目錄下新建proxy.conf文件,上傳upstream.conf文件,新建目錄vhosts,把反向代理server配置文件上傳到vhosts目錄下

然后nginx.conf配置文件下面添加增加保存服務(wù)器名字的hash表大小,否則太多vhosts多vhosts情況下會(huì)有nginx語(yǔ)法檢測(cè)報(bào)錯(cuò):

server_names_hash_bucket_size 128; ?默認(rèn)是64


2.域名重寫(xiě)

1)這個(gè)功能需要加載ngx_http_rewrite_module模塊,默認(rèn)就會(huì)安裝


2)主要指令Break、If、Return、Rewrite、Set


3)Rewrite

rewrite指令

語(yǔ)法:rewrite regex replacement [flag];

作用域:server,location,if

該指令會(huì)按照相關(guān)的regex正則表達(dá)式和replacement替換字符串改變url,如果replacement替代字符串由http://開(kāi)始,那么客戶端會(huì)被重定向

flag可以是如下參數(shù)

last :在搜索到相應(yīng)的URL和location之后完成rewrite指令

break: 本條規(guī)則匹配完成后,終止匹配,不再匹配后面的規(guī)則

redirect :返回302臨時(shí)重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址

permant: 返回301永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址

最終完整的重定向URL包括請(qǐng)求scheme(http://,https://等),請(qǐng)求的 server_name_in_redirect和 port_in_redirec三部分 ,說(shuō)白了也就是http協(xié)議 域名 端口三部分組成


4)If

默認(rèn)值:無(wú)if指令

語(yǔ)法:if(condition)

作用域:server,location

對(duì)給定的條件condition進(jìn)行判斷。如果為真,大括號(hào)內(nèi)的rewrite指令將被執(zhí)行。


5)Set

set指令

語(yǔ)法:set variable value;

作用域:server,location,if

定義一個(gè)變量并賦值,值可以是文本,變量或者文本變量混合體


6)主要用到rewrite,下面是示例

if ($http_user_agent ~* "(android|iphone|UCWEB|ipod|windows[[:space:]]phone)") {

? ? ? ? ? ?set $redirect Y;

? ? ? ? ? }

if ($http_cookie ~* "userswitch") {

? ? ? ? ? ?set $redirect N;

? ? ? ? ? }

if ($redirect = Y) {

? ? ? ? ? ? rewrite ^/(.*)$ http://m.test.com/$1 last;

? ? ? ? }

以上就是先判斷是不是移動(dòng)端來(lái)訪問(wèn),如果是移動(dòng)端來(lái)訪問(wèn),就重定向到移動(dòng)站點(diǎn),其中有set設(shè)置一個(gè)變變量方便下面判斷


3.連接數(shù)請(qǐng)求數(shù)限制功能

1)要實(shí)現(xiàn)這兩個(gè)功能需要安裝ngx_http_limit_conn_module和ngx_http_limit_req_module模塊,默認(rèn)都會(huì)安裝。

2)ngx_http_limit_conn_module 模塊可以按照定義的鍵限定每個(gè)鍵值的連接數(shù)。特別的,可以設(shè)定單一 IP 來(lái)源的連接數(shù)。并不是所有的連接都會(huì)被模塊計(jì)數(shù);只有那些正在被處理的請(qǐng)求(這些請(qǐng)求的頭信息已被完全讀入)所在的連接才會(huì)被計(jì)數(shù)。指定一塊已經(jīng)設(shè)定的共享內(nèi)存空間,以及每個(gè)給定鍵值的最大連接數(shù)。當(dāng)連接數(shù)超過(guò)最大連接數(shù)時(shí),服務(wù)器將會(huì)返回 503 (Service Temporarily Unavailable) 錯(cuò)誤。比如,如下配置


3)ngx_http_limit_req_module,和nginx類似,不過(guò)支持多個(gè)變量,并且支持多個(gè)limit_req_zone的設(shè)置。比如:

limit_req_zone $binary_remote_addr zone=one:3m rate=1r/s; ??

limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;

limit_req_zone $binary_remote_addr $request_uri zone=thre:3m rate=1r/s;

上面的第二個(gè)指令表示當(dāng)相同的ip地址并且訪問(wèn)相同的uri,會(huì)導(dǎo)致進(jìn)入limit req的限制(每秒1個(gè)請(qǐng)求

? ? ? ? ? ? ? ? ? ? ??

4)綜合起來(lái)具體配置如下:

A.在http區(qū)域添加如下配置

? ?geo $white_ip {

? ? ? ? ranges;

? ? ? ? default 0;

? ? ? ? 127.0.0.1-127.0.0.255 1;

? ? }

? ? limit_req_whitelist geo_var_name=white_ip geo_var_value=1;

? ? 以上是設(shè)置白名單,白名單里面的IP不受連接數(shù)和請(qǐng)求數(shù)限制


? ? limit_conn_zone $binary_remote_addr zone=addr:10m;

? ? limit_conn_log_level ?info;


? ? limit_req_log_level info;

? ? limit_req_zone $binary_remote_addr zone=one:3m rate=10r/s;


注意,這里使用的是$binary_remote_addr變量,而不是$remote_addr變量。$remote_addr變量的長(zhǎng)度為7字節(jié)到15字節(jié)不等,而存儲(chǔ)狀態(tài)在32位平臺(tái)中占用32字節(jié)或64字節(jié),在64位平臺(tái)中占用64字節(jié)。而$binary_remote_addr變量的長(zhǎng)度是固定的4字節(jié),存儲(chǔ)狀態(tài)在32位平臺(tái)中占用32字節(jié)或64字節(jié),在64位平臺(tái)中占用64字節(jié)。一兆字節(jié)的共享內(nèi)存空間可以保存3.2萬(wàn)個(gè)32位的狀態(tài),1.6萬(wàn)個(gè)64位的狀態(tài)。如果共享內(nèi)存空間被耗盡,服務(wù)器將會(huì)對(duì)后續(xù)所有的請(qǐng)求返回 503 (Service Temporarily Unavailable) 錯(cuò)誤


B.在vhosts配置文件中l(wèi)ocation區(qū)域添加如下:

? ? ? location / {

? ? ? ? ? limit_req zone=one burst=5;#在全局請(qǐng)求數(shù)基礎(chǔ)上可以多5個(gè)

limit_conn addr 3;#單個(gè)IP并發(fā)連接數(shù)為3

? ? ? ? ? proxy_pass http://test_com;

? ? ? ? ? access_log ?/data/wwwlogs/access_test_com.log ?access;

? ? ? } ? ?


C.Webbench測(cè)試查看日志

/usr/loca/bin/webbench http://test.com/test.html -c 100 -t 20

可以選擇2兩個(gè)測(cè)試點(diǎn)測(cè)試,一個(gè)添加到白名單,一個(gè)沒(méi)有,然后同時(shí)壓力測(cè)試,通過(guò)Tengine的訪問(wèn)日志來(lái)觀察,和webbench自身連接成功率進(jìn)行判斷:

白名單沒(méi)有添加測(cè)試服務(wù)器IP前全是503錯(cuò)誤

添加測(cè)試服務(wù)器IP后都是200正常訪問(wèn)


4.Nginx阻止用戶代理

有些時(shí)候,需要阻止某些用戶代理訪問(wèn)網(wǎng)站,比如ab,wget,curl等等,這就需要使用到$http_user_agent變量。

修改nginx.conf


if ($http_user_agent ~* (Wget|ab) ) {

return 403;

}

if ($http_user_agent ~* LWP::Simple|BBBike|wget) {

?return 403;

}

重啟nginx

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


九、結(jié)果

1.本文主要介紹了Tengine,安裝,配置,優(yōu)化,并對(duì)其反向代理服務(wù)器功能這塊做了詳細(xì)的研究和測(cè)試,發(fā)現(xiàn)其能很好的滿足高并發(fā)web服務(wù)器請(qǐng)求,另外Tengine功能上完全和nginx兼容,很適合從nginx向Tengine的轉(zhuǎn)變,在nginx中所以的用法都可以在Tengine中使用,但是Tengine做了很多優(yōu)化及性能的提高,更適合國(guó)內(nèi)場(chǎng)景的使用


2.Tengine的用途比較多,比如web服務(wù)器,代理服務(wù)器,緩存服務(wù)器,反向代理服務(wù)器,郵件代理服務(wù)器,這里只是簡(jiǎn)單測(cè)試一下靜態(tài)web服務(wù)器,重點(diǎn)放在了反向代理服務(wù)器這塊,測(cè)試了反向代理服務(wù)器的域名重寫(xiě)和反向代理負(fù)載均衡功能,還有連接限制


3.Tengine增加了很多細(xì)節(jié)方面的調(diào)整,這個(gè)得在使用過(guò)程中慢慢體驗(yàn),包括nginx對(duì)系統(tǒng)的監(jiān)控,對(duì)源站的健康檢查,多種負(fù)載算法,動(dòng)態(tài)添加模塊,和系統(tǒng)日志的結(jié)合,輸入過(guò)濾機(jī)制的支持,動(dòng)態(tài)腳本語(yǔ)言lua的支持等等


4.Tengine是的每一項(xiàng)功能都值得去深入了解,特別是ngx_http_rewrite_module模塊,ngx_http_proxy_module模塊,ngx_http_upstream_module模塊三大模塊支撐起了他在作為反向代理負(fù)載均衡服務(wù)器市場(chǎng)的重要地位,這里對(duì)這三大模塊的了解算是九牛一毛,特別是各種符合實(shí)際場(chǎng)景的域名重寫(xiě)規(guī)則(需要對(duì)正則表達(dá)式有一定的了解),反向代理proxy對(duì)header頭的把握和對(duì)日志格式的影響以及對(duì)后端源站的影響,不去深入研究很難弄清楚,這里upstream負(fù)載均衡模塊還算簡(jiǎn)單點(diǎn),但是Tengine版本還算多添加了幾個(gè)算法例如散列和會(huì)話保持功能都沒(méi)有來(lái)得及去研究,由于時(shí)間和篇幅有限,這里只了解這些。


轉(zhuǎn)載于:https://blog.51cto.com/jerrymin/1644012

總結(jié)

以上是生活随笔為你收集整理的代理服务器Tengine的研究与测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。