nginx整理

来源:http://www.cnblogs.com/dytl/archive/2016/03/08/5252867.html
-Advertisement-
Play Games

一、為什麼選擇Nginx搭建Web伺服器 Apache和Nginx是目前使用最火的兩種Web伺服器,Apache出現比Nginx早。Apache HTTP Server(簡稱Apache)是世界使用排名第一的Web伺服器軟體,音譯為阿帕奇,是Apache軟體基金會的一個開放源碼Web伺服器,可以運行


一、為什麼選擇Nginx搭建Web伺服器

Apache和Nginx是目前使用最火的兩種Web伺服器,Apache出現比Nginx早。Apache HTTP Server(簡稱Apache)是世界使用排名第一的Web伺服器軟體,音譯為阿帕奇,是Apache軟體基金會的一個開放源碼Web伺服器,可以運行幾乎所有的電腦平臺,其次開放的API介面,任何組織和個人都可以在它上面擴展和增加各種需要功能,達到為自己量身定製的功能。

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

在互聯網初期,網站大小不是很大,訪問量都很輕量,一個網站的訪問量一天最多就幾萬IP,這個時候Apache完全可以滿足需要,人們更多的是為它開發各種模塊,像重寫模塊,訪問控制列表,緩存模塊等等。但是隨著互聯網的飛速發展,網站我訪問量以指數增長,大型網站的除了加大硬體投入外,典型的Web伺服器Apache這時候也力不從心了;但是Apache並不是完美的,並且不再適合大規模系統。

為什麼?因為他的進程模式雖然簡單而靈活,但並不適合大規模尤其是當要處理像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不間斷運行,即使運行數個月也不需要重新啟動。你還能夠在不間斷服務的情況下進行軟體版本的升級。

二、Nginx安裝

1、安裝說明

系統環境: CentOS-6.6
軟體: nginx-1.8.0.tar.gz
安裝方式: 源碼編譯安裝
安裝位置: /opt/program/nginx-1.8.0
下載地址: http://nginx.org/en/download.html

2、安裝必須軟體

# 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

3、安裝和編譯

將安裝包文件上傳到/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        安裝

4、配置服務項

修改防火牆配置: 
# vi + /etc/sysconfig/iptables
添加配置項 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
重啟防火牆 
# service iptables restart

5、啟動

方法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支持高併發

1、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 時間內一次沒被使用,它將被移除。

2、內核參數的優化

編輯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安全配置策略。

1、刪除所有不需要的Nginx模塊

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

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

通過以下命令來查看當編譯Nginx伺服器時哪個模塊能開戶或關閉:

#./configure –help | less

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

2、安裝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

3、控制緩衝區溢出攻擊

編輯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 ##

4、控制併發連接

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

limit_zone slimits $binary_remote_addr 5m;
limit_conn slimits 5;

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

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 ##

6、拒絕一些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;
}

7、防止圖片盜鏈

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

# Stop deep linking or hot linking
location /images/ {
valid_referers none blocked www.example.com example.com;
if ($invalid_referer) {
return   403;
}
}

8、在防火牆級限制每個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選項來刪除這些文件。

10、限制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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 三、輸入輸出重定向及管道01.過濾器 Linux過濾器分三種: 1.過濾器(重定向只對過濾器有作用) #gzip a(將a作為輸入源,涉及到輸入輸出) 2.編輯器 3.互動式工具 #setup02.標準輸入輸出03.改變標準輸出#ls >(將正確的輸出輸出去) /tmp/aaa#ls /tttt 2
  • 軟體調試的應用場景一般是: 查找程式的BUG 逆向破解 本篇文章是本人在閱讀張銀奎老師的 <軟體調試>做的筆記. 主要闡述調試器獲取到的調試事件是何時產生,如何收集的. 閱讀目錄 進程創建和線程創建事件的採集過程 進程和線程退出事件的採集過程 模塊映射和反映射事件的採集過程 異常事件的採集 能夠採集
  • 二、shell對文本的操作01.查看文本的命令#cat /etc/passwd(並非對文本文件操作)#tail -5 /etc/passwd(查看末尾5行)#tail -f /var/log/messages(對日誌文件監視)02.使用正則表達式的命令#cat sdkjfalkdsjfsdkjfal
  • Linux shell入門基礎(一):01.增加刪除用戶:#useradd byf userdel byf(主目錄未刪除) userdel -r byf 該用戶的屬性:usermod 用命令行的方式改下述配置文件 修改byf的組目錄:usermod -G root,bin,todd byf(將用戶添
  • windows service管理
  • 來自系統媽:http://www.xitongma.com 番茄花園GHOST win7系統64位專業破解版 V2016年3月 系統概述 番茄花園ghost win7 64位專業破解版系統在我的電腦右鍵加入了設備管理器、服務、控制面板、方便大家使用;禁用如關閉錯誤報告,關閉幫助等一些服務,提高系統性
  • 博客園(FOREVER_ENJOY):http://www.cnblogs.com/zyx1314/ 本文版權歸作者所有;歡迎轉載!請註明文章作者和原文連接 Shell是什麼? 1. Shell作為應用程式部署在Linux內核周圍。Linux是高度模塊化的系統,可安裝多種Shell程式。 2. Sh
  • 指令名稱: nl - 顯示文件的行數及內容 語法: nl [OPTION]... [FILE]... 說明: 將指定文件的內容附加上行數,顯示到標準輸出。 當沒有指定文件名或使用 "-" 符號時,數據將由標準輸入讀入。選項: -b --body-numbering=STYLE 自訂附加的行號樣式(S
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...