構建高效安全的Nginx Web服務器

構建高效安全的Nginx Web服務器

html

爲何選擇Nginx搭建Web服務器linux

Apache和Nginx是目前使用最火的兩種Web服務器,Apache出現比Nginx早。Apache HTTP Server(簡稱Apache)是世界使用排名第一的Web服務器軟件,音譯爲阿帕奇,是Apache軟件基金會的一個開放源碼Web服務器,能夠運行幾乎全部的計算機平臺,其次開放的API接口,任何組織和我的均可以在它上面擴展和增長各類須要功能,達到爲本身量身定製的功能。nginx

Nginx(「engine x」)是一個高性能的HTTP和反向代理服務器,也是一個 IMAP/POP3/SMTP代理服務器。Nginx 是由 Igor Sysoev 爲俄羅斯訪問量第二的 Rambler.ru 站點開發的,第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。c++

在互聯網初期,網站大小不是很大,訪問量都很輕量,一個網站的訪問量一天最多就幾萬IP,這個時候Apache徹底能夠知足須要,人們更多的是爲它開發各類模塊,像重寫模塊,訪問控制列表,緩存模塊等等。可是隨着互聯網的飛速發展,網站我訪問量以指數增加,大型網站的除了加大硬件投入外,典型的Web服務器Apache這時候也力不從心了;可是Apache並非完美的,而且再也不適合大規模系統。web

爲何?由於他的進程模式雖然簡單而靈活,但並不適合大規模尤爲是當要處理像PHP這種須要佔用大量內存應用程序代碼時。因而Nginx開始崛起,最初的設計是俄羅斯工程師爲大型網站解決高併發設計的。因此註定了高併發是它永恆的優勢。再次就是反向代理,如今大型網站分工詳細,哪些服務器處理數據流,哪些處理靜態文件,這些誰指揮,通常都是用nginx反向代理到內網服務器,這樣就起到了負載均衡分流的做用。再次nginx高度模塊化的設計,編寫模塊相對簡單。瀏覽器

Nginx 是一個高性能的 Web 和反向代理服務器,它具備有不少很是優越的特性:緩存

做爲 Web 服務器:相比 Apache,Nginx使用更少的資源,支持更多的併發鏈接,體現更高的效率,這點使 Nginx 尤爲受到虛擬主機提供商的歡迎。可以支持高達 50,000個併發鏈接數的響應,感謝 Nginx爲咱們選擇了epoll and kqueue 做爲開發模型。安全

做爲負載均衡服務器: Nginx既能夠在內部直接支持 Rails 和 PHP,也能夠支持做爲 HTTP代理服務器 對外進行服務。Nginx用C編寫, 不管是系統資源開銷仍是 CPU 使用效率都比 Perlbal 要好的多。服務器

Nginx安裝很是的簡單,配置文件很是簡潔(還可以支持perl語法),Bugs很是少的服務器: Nginx啓動特別容易,而且幾乎能夠作到7*24不間斷運行,即便運行數個月也不須要從新啓動。你還可以在不間斷服務的狀況下進行軟件版本的升級。cookie

 

Nginx安裝

一、安裝說明

系統環境: CentOS-6.6

軟件: nginx-1.8.0.tar.gz

安裝方式: 源碼編譯安裝

安裝位置: /opt/program/nginx-1.8.0

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

二、安裝必須軟件

# yum install gcc-c++

# yum -y install zlib zlib-devel openssl openssl–devel pcre pcre-devel

# find -name nginx

#./nginx

#./nginx/sbin/nginx

#./nginx-1.2.6/objs/nginx

檢查系統已安裝的Nginx:

卸載原有的Nginx

# yum remove nginx

三、安裝和編譯

將安裝包文件上傳到/opt/software中執行如下操做:

# cd /opt/program

# mkdir nginx

# tar -zxvf ../software/nginx-1.8.0.tar.gz

# cd nginx-1.8.0

# ./configure –prefix=/opt/program/nginx

注:處此是指定Nginx的安裝目錄,大多用戶習慣於安裝在/usr/local/nginx下面

# make 編譯

# make install 安裝

四、配置服務項

修改防火牆配置:

# vi + /etc/sysconfig/iptables

添加配置項

-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT

重啓防火牆

# service iptables restart

五、啓動

方法1

# /opt/program/nginx/sbin/nginx -c /opt/program/nginx/sbin/nginx/conf/nginx.conf

方法2

# /opt/program/nginx/sbin/nginx

查詢nginx主進程號

# ps -ef | grep nginx

強制中止

# pkill -9 nginx

重啓

# /opt/program/nginx/sbin/nginx -s reload

測試

# netstat –na|grep 80

#瀏覽器中測試

http://ip:80

 

 

配置Nginx支持高併發

一、Nginx常規優化

編輯nginx.conf,修改相關參數進行優化。

worker_processes 8;

Nginx 進程數,建議按照CPU數目來指定,通常爲它的倍數 (如,2個四核的CPU計爲8)。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

worker_rlimit_nofile 65535;

這個指令是指當一個Nginx 進程打開的最多文件描述符數目,理論值應該是最多打開文

件數(ulimit -n)與nginx 進程數相除,可是Nginx 分配請求並非那麼均勻,因此最好與ulimit -n 的值保持一致。如今在linux 2.6內核下開啓文件打開數爲65535,worker_rlimit_nofile就相應應該填寫65535。

worker_connections 65535;

每一個進程容許的最多鏈接數, 理論上每臺nginx 服務器的最大鏈接數爲worker_processes*worker_connections。keepalive_timeout 60;keepalive 超時時間。

client_header_buffer_size 4k;

客戶端請求頭部的緩衝區大小,這個能夠根據你的系統分頁大小來設置,通常一個請求頭的大小不會超過1k,不過因爲通常系統分頁都要大於1k,因此這裏設置爲分頁大小。

open_file_cache max=65535 inactive=60s;

這個將爲打開文件指定緩存,默認是沒有啓用的,max 指定緩存數量,建議和打開文件數一致,inactive 是指通過多長時間文件沒被請求後刪除緩存。

open_file_cache_valid 80s;

這個是指多長時間檢查一次緩存的有效信息。

open_file_cache_min_uses 1;

open_file_cache 指令中的inactive

參數時間內文件的最少使用次數,若是超過這個數字,文件描述符一直是在緩存中打開的,如上例,若是有一個文件在inactive 時間內一次沒被使用,它將被移除。

二、內核參數的優化

編輯sysctl.conf優化linux內核。

net.ipv4.tcp_max_tw_buckets = 6000

timewait 的數量,默認是180000。

net.ipv4.ip_local_port_range = 1024 65000

容許系統打開的端口範圍。

net.ipv4.tcp_tw_recycle = 1

啓用timewait 快速回收。

net.ipv4.tcp_tw_reuse = 1

開啓重用。容許將TIME-WAIT sockets 從新用於新的TCP 鏈接。

net.ipv4.tcp_syncookies = 1

開啓SYN Cookies,當出現SYN 等待隊列溢出時,啓用cookies 來處理。

net.core.somaxconn = 262144

web 應用中listen 函數的backlog 默認會給咱們內核參數的net.core.somaxconn 限制到128,而nginx 定義的NGX_LISTEN_BACKLOG 默認爲511,因此有必要調整這個值。

net.core.netdev_max_backlog = 262144

每一個網絡接口接收數據包的速率比內核處理這些包的速率快時,容許送到隊列的數據包的最大數目。

net.ipv4.tcp_max_orphans = 262144

系統中最多有多少個TCP 套接字不被關聯到任何一個用戶文件句柄上。若是超過這個數字,孤兒鏈接將即刻被複位並打印出警告信息。這個限制僅僅是爲了防止簡單的DoS 攻擊,不能過度依靠它或者人爲地減少這個值,更應該增長這個值(若是增長了內存以後)。

net.ipv4.tcp_max_syn_backlog = 262144

記錄的那些還沒有收到客戶端確認信息的鏈接請求的最大值。對於有128M 內存的系統而言,缺省值是1024,小內存的系統則是128。

net.ipv4.tcp_timestamps = 0

時間戳能夠避免序列號的卷繞。一個1Gbps 的鏈路確定會遇到之前用過的序列號。時間戳可以讓內核接受這種「異常」的數據包。這裏須要將其關掉。

net.ipv4.tcp_synack_retries = 1

爲了打開對端的鏈接,內核須要發送一個SYN 並附帶一個迴應前面一個SYN 的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄鏈接以前發送SYN+ACK 包的數量。

net.ipv4.tcp_syn_retries = 1

在內核放棄創建鏈接以前發送SYN 包的數量。

net.ipv4.tcp_fin_timeout = 1

若是套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2 狀態的時間。對端能夠出錯並永遠不關閉鏈接,甚至意外當機。缺省值是60 秒。2.2 內核的一般值是180 秒,3你能夠按這個設置,但要記住的是,即便你的機器是一個輕載的WEB 服務器,也有由於大量的死套接字而內存溢出的風險,FIN- WAIT-2 的危險性比FIN-WAIT-1 要小,由於它最多隻能吃掉1.5K 內存,可是它們的生存期長些。

net.ipv4.tcp_keepalive_time = 30

當keepalive 起用的時候,TCP 發送keepalive 消息的頻度。缺省是2小時。

通過以上優化後,Nginx可支持超過5萬的併發量。

 

Nginx安全配置

網絡上有太多關於Nginx安全配置的方法,本文根據本身的實際環境,選擇適合本身的Nginx安全配置策略。

一、刪除全部不須要的Nginx模塊

直接經過編譯Nginx源代碼使模塊數量最少化。經過限制只容許Web服務器訪問模塊把風險降到最低。例如,禁用SSL和autoindex模塊你能夠執行如下命令:

#./configure –without-http_autoindex_module –without-http_ssi_module

# make

# make install

經過如下命令來查看當編譯Nginx服務器時哪一個模塊能開戶或關閉:

#./configure –help | less

而後禁用你用不到的Nginx模塊。

二、安裝SELinux策略以強化Nginx Web服務器

默認的SELinux不會保護Nginx Web服務器,我這裏安裝和編譯保護軟件。

安裝編譯SELinux所需環境支持

# yum -y install selinux-policy-targeted selinux-policy-devel

下載SELinux策略以強化Nginx Web服務器。

# cd /opt

# wget ‘http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz?use_mirror=nchc’

解壓文件

# tar -zxvf se-ngix_1_0_10.tar.gz

編譯文件

# cd se-ngix_1_0_10/nginx

# make

將會輸出以下:

Compiling targeted nginx module

/usr/bin/checkmodule: loading policy configuration from tmp/nginx.tmp

/usr/bin/checkmodule: policy configuration loaded

/usr/bin/checkmodule: writing binary representation (version 6) to tmp/nginx.mod

Creating targeted nginx.pp policy package

# rm tmp/nginx.mod.fc tmp/nginx.mod

安裝生成的nginx.pp SELinux模塊:

# /usr/sbin/semodule -i nginx.pp

三、控制緩衝區溢出攻擊

編輯nginx.conf,爲全部客戶端設置緩衝區的大小限制。

# vi /usr/local/nginx/conf/nginx.conf

編輯和設置全部客戶端緩衝區的大小限制以下:

## Start: Size Limits & Buffer Overflows ##

client_body_buffer_size 1K;

client_header_buffer_size 1k;

client_max_body_size 1k;

large_client_header_buffers 2 1k;

## END: Size Limits & Buffer Overflows ##

四、控制併發鏈接

使用NginxHttpLimitZone模塊來限制指定的會話或者一個IP地址的特殊狀況下的併發鏈接。編輯nginx.conf:

limit_zone slimits $binary_remote_addr 5m;

limit_conn slimits 5;

上面表示限制每一個遠程IP地址的客戶端同時打開鏈接不能超過5個。

五、限制可用的請求方法

GET和POST是互聯網上最經常使用的方法。 Web服務器的方法被定義在RFC 2616。若是Web服務器不要求啓用全部可用的方法,它們應該被禁用。下面的指令將過濾只容許GET,HEAD和POST方法:

## Only allow these request methods ##

if ($request_method !~ ^(GET|HEAD|POST)$ ) {

return 444;

}

## Do not accept DELETE, SEARCH and other methods ##

六、拒絕一些User-Agents

你能夠很容易地阻止User-Agents,如掃描器,機器人以及濫用你服務器的垃圾郵件發送者。

## Block download agents ##

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

return 403;

}

##

阻止Soso和有道的機器人:

## Block some robots ##

if ($http_user_agent ~* Sosospider|YodaoBot) {

return 403;

}

七、防止圖片盜鏈

圖片或HTML盜鏈的意思是有人直接用你網站的圖片地址來顯示在他的網站上。最終的結果,你須要支付額外的寬帶費用。須要封鎖,並阻止盜鏈行爲。

# Stop deep linking or hot linking

location /images/ {

valid_referers none blocked www.example.com example.com;

if ($invalid_referer) {

return 403;

}

}

八、在防火牆級限制每一個IP的鏈接數

網絡服務器必須監視鏈接和每秒鏈接限制。PF和Iptales都可以在進入你的Nginx服務器以前阻止最終用戶的訪問。

Linux Iptables:限制每次Nginx鏈接數

下面的例子會阻止來自一個IP的60秒鐘內超過15個鏈接端口80的鏈接數。

# /sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –set

# sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –update –seconds 60 –hitcount 15 -j DROP

service iptables save

我設置同一個IP 60秒內只容許10個Nginx連接。

9:配置操做系統保護Web服務器

Nginx程序通常以用戶nginx運行。可是根目錄(/nginx或者/usr /local/nginx/html)不該該設置屬於用戶nginx或對用戶nginx可寫。找出錯誤權限的文件可使用以下命令:

# find /nginx -user nginx

# find /usr/local/nginx/html -user nginx

確保你更全部權爲root或其它用戶,一個典型的權限設置

/usr/local/nginx/html/

ls -l /usr/local/nginx/html/

示例輸出:

-rw-r–r– 1 root root 925 Jan 3 00:50 error4xx.html

-rw-r–r– 1 root root 52 Jan 3 10:00 error5xx.html

-rw-r–r– 1 root root 134 Jan 3 00:52 index.html

刪除由vi或其它文本編輯器建立的備份文件:

# find /nginx -name ‘.?*’ -not -name .ht* -or -name ‘*~’ -or -name ‘*.bak*’ -or -name ‘*.old*’

# find /usr/local/nginx/html/ -name ‘.?*’ -not -name .ht* -or -name ‘*~’ -or -name ‘*.bak*’ -or -name ‘*.old*’

經過find命令的-delete選項來刪除這些文件。

十、限制Nginx鏈接傳出

黑客會使用工具如wget下載你服務器本地的文件。使用Iptables從nginx用戶來阻止傳出鏈接。ipt_owner模塊試圖匹配本地產生的數據包的建立者。下面的例子中只容許user用戶在外面使用80鏈接。

# /sbin/iptables -A OUTPUT -o eth0 -m owner –uid-owner vivek -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT

相關文章
相關標籤/搜索