Nginx javascript
Nginx是一款面向性能設計的HTTP服務器,相較於Apache、lighttpd具備佔有內存少,nginx不採用每客戶機一線程的設計模型,而是充分使用異步邏輯,削減了上下文調度開銷,因此併發服務能力更強。總體採用模塊化設計,有豐富的模塊庫和第三方模塊庫,配置靈活。 在Linux操做系統下,nginx使用epoll事件模型,得益於此,nginx在Linux操做系統下效率至關高。php
Nginx的優勢:css
Nginx做爲http服務器,的特徵html
處理靜態文件,索引文件以及自動索引,打開文件描述符緩衝。前端
無緩存的反向代理加速,簡單的負載均衡和容錯。java
FastCGI,簡單的負載均衡和容錯node
Nginx服務器的類型linux
web服務器:web服務器用於提供http的訪問。nginx
應用程序服務器:客戶端回話管理,業務邏輯管理,數據操做git
反向代理
後臺代理
防火牆
user nginx nginx; //指定nginx運行的用戶及用戶組爲nginx,默認爲nobody
worker_processes 2; //開啓的進程數,通常跟邏輯cpu核數一致 cat /proc/cpuinfo| grep "processor"| wc -l
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; //爲每一個進程分配 cpu,上例中將 8 個進程分配到 8 個 cpu,固然能夠寫多個,或者將一個進程分配到多個 cpu。
error_log logs/error.log notice; //定於全局錯誤日誌文件,級別以notice顯示。還有debug、info、warn、error、crit模式,debug輸出最多,crit輸出最少,更加實際環境而定。
pid logs/nginx.pid; //指定進程id的存儲文件位置
worker_rlimit_nofile 65535; //指定一個nginx進程打開的最多文件描述符數目,受系統進程的最大打開文件數量限制。能夠調整系統系統最大打開文件數來更改設置
events {
use epoll; 設置工做模式爲epoll,除此以外還有select、poll、kqueue、rtsig和/dev/poll模式
worker_connections 65535; //定義每一個進程的最大鏈接數 受系統進程的最大打開文件數量限制
}
epoll模型:
epoll是Linux內核爲處理大批量文件描述符而做了改進的epoll, 它能顯著提升程序在大量併發鏈接中只有少許活躍的狀況下的系統CPU利用率
優勢:
支持一個進程打開大數目的socket描述符
它所支持的FD上限是最大能夠打開文件的數目,這個數字通常遠大於2048,舉個例子,在1GB內存的機器上大約是10萬左右,具體數目能夠cat /proc/sys/fs/file-max查看,通常來講這個數目和系統內存關係很大。
反觀select 一個進程所打開的FD是有必定限制的,由FD_SETSIZE設置,默認值是1024。對於那些須要支持的上萬鏈接數目的IM服務器來講顯然太少了(例如:Apache)
IO效率不隨FD數目增長而線性降低
傳統的select/poll另外一個致命弱點就是當你擁有一個很大的socket集合,不過因爲網絡延時,任一時間只有部分的socket是"活躍"的,可是select/poll每次調用都會線性掃描所有的集合,致使效率呈現線性降低。 epoll它只會對"活躍"的socket進行操做---這是由於在內核實現中epoll是根據每一個fd上面的callback函數實現的
使用mmap加速內核與用戶空間的消息傳遞
不管是select,poll仍是epoll都須要內核把FD消息通知給用戶空間, 如何避免沒必要要的內存拷貝就很重要,在這點上,epoll是經過內核與用戶空間mmap同一塊內存實現的.
http {
include mime.types; //主模塊指令,實現對配置文件所包含的文件的設定,能夠減小主配置文件的複雜度,DNS主配置文件中的zonerfc1912,acl基本上都是用的include語句
default_type application/octet-stream; //核心模塊指令,這裏默認設置爲二進制流,也就是當文件類型未定義時使用這種方式
//下面代碼爲日誌格式的設定,main爲日誌格式的名稱,可自行設置,後面引用。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main; //引用日誌main
client_max_body_size 20m; //設置容許客戶端請求的最大的單個文件字節數
client_header_buffer_size 32k; //指定來自客戶端請求頭的headebuffer大小
client_body_temp_path /dev/shm/client_body_temp; //指定鏈接請求試圖寫入緩存文件的目錄路徑
large_client_header_buffers 4 32k; //指定客戶端請求中較大的消息頭的緩存最大數量和大小,目前設置爲4個32KB
sendfile on; //開啓高效文件傳輸模式
tcp_nopush on; //開啓防止網絡阻塞
tcp_nodelay on; //開啓防止網絡阻塞
keepalive_timeout 65; //設置客戶端鏈接保存活動的超時時間
client_header_timeout 10; //用於設置客戶端請求讀取超時時間
client_body_timeout 10; //用於設置客戶端請求主體讀取超時時間
send_timeout 10; //用於設置相應客戶端的超時時間
//如下是httpGzip模塊配置
#httpGzip modules
gzip on; //開啓gzip壓縮
gzip_min_length 1k; //設置容許壓縮的頁面最小字節數
gzip_buffers 4 16k; //申請4個單位爲16K的內存做爲壓縮結果流緩存
gzip_http_version 1.1; //設置識別http協議的版本,默認是1.1
gzip_comp_level 2; //指定gzip壓縮比,1-9 數字越小,壓縮比越小,速度越快.
gzip_types text/plain application/x-javascript text/css application/xml; //指定壓縮的類型
gzip_vary on; //讓前端的緩存服務器存通過gzip壓縮的頁面
反向代理:
location / {
#設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#禁用緩存
proxy_buffering off;
#設置反向代理的地址
proxy_pass http://192.168.1.1;
}
負載均衡
upstream test{
#ip_hash;
server 192.168.1.251;
server 192.168.1.252;
server 192.168.1.247;
}
server {
listen 80;
server_name helloword;
location / {
#反向代理的地址
proxy_pass http://test;
}
}
負載均衡+反向代理完整配置示例
nginx.conf:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream test{
#ip_hash;
server 192.168.1.251;
server 192.168.1.252;
server 192.168.1.247;
}
server {
listen 80;
server_name 2;
location / {
#設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#禁用緩存
proxy_buffering off;
#反向代理的地址
proxy_pass http://test;
}
}
}
動靜分離
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream test {
#ip_hash;
server 192.168.1.251;
server 192.168.1.252;
server 192.168.1.247;
}
server {
listen 80;
server_name 2;
#配置Nginx動靜分離,定義的靜態頁面直接從Nginx發佈目錄讀取。
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
root /usr/local/nginx/html/myloan;
#expires定義用戶瀏覽器緩存的時間爲7天,若是靜態頁面不常更新,能夠設置更長,這樣能夠節省帶寬和緩解服務器的壓力
expires 7d;
}
#全部jsp、do的動態請求都交給後面的tomcat處理
location ~ (\.jsp)|(\.do)$ {
#tomcat地址
proxy_pass http://test;
proxy_redirect off;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
}
完整的Nginx.conf配置文件
#運行用戶
user www-data;
#啓動進程,一般設置成和cpu的數量相等
worker_processes 1;
#全局錯誤日誌及PID文件
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
#工做模式及鏈接數上限
events {
use epoll; #epoll是多路複用IO(I/O Multiplexing)中的一種方式,可是僅用於linux2.6以上內核,能夠大大提升nginx的性能
worker_connections 1024;#單個後臺worker process進程的最大併發連接數
# multi_accept on;
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
#設定mime類型,類型由mime.type文件定義
include /etc/nginx/mime.types;
default_type application/octet-stream;
#設定日誌格式
access_log /var/log/nginx/access.log;
#sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
#必須設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,下降系統的uptime.
sendfile on;
#tcp_nopush on;
#鏈接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#開啓gzip壓縮
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#設定請求緩衝
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
#設定負載均衡的服務器列表
upstream mysvr {
#weigth參數表示權值,權值越高被分配到的概率越大
#本機上的Squid開啓3128端口
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
server {
#偵聽80端口
listen 80;
#定義使用www.xx.com訪問
server_name www.xx.com;
#設定本虛擬主機的訪問日誌
access_log logs/www.xx.com.access.log main;
#默認請求
location / {
root /root; #定義服務器的默認網站根目錄位置
index index.php index.html index.htm; #定義首頁索引文件的名稱
fastcgi_pass www.xx.com;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /root;
}
#靜態文件,nginx本身處理
location ~ ^/(p_w_picpaths|javascript|js|css|flash|media|static)/ {
root /var/www/virtual/htdocs;
#過時30天,靜態文件不怎麼更新,過時能夠設大一點,若是頻繁更新,則能夠設置得小一點。
expires 30d;
}
#PHP 腳本請求所有轉發到 FastCGI處理. 使用FastCGI默認配置.
location ~ \.php$ {
root /root;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
include fastcgi_params;
}
#設定查看Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#禁止訪問 .htxxx 文件
location ~ /\.ht {
deny all;
}
}
}
nginx作七層防火牆
使用 /../nginx -V
先查看原來都有哪些模塊。
而後把上面這些先複製下來以做備用。
第二步:安裝依賴,阿里雲的服務器能夠直接使用yum安裝或者升級
yum install -y gcc make automake autoconf libtool yum install -y pcre pcre-devel libxml2 libxml2-devel curl curl-devel httpd-devel
git clone https://github.com/SpiderLabs/ModSecurity.git mod_security cd mod_security ./autogen.sh ./configure --enable-standalone-module make
*(爲了不出錯,可先將autogen.sh的權限改爲777)
wget http://www.nginx.org/download/nginx-1.10.2.tar.gz
找到nginx-1.10.1/auto/lib/openssl/conf文件,將第31-35行編輯爲
*(爲下面編譯openssl作準備)
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz tar -xvpzf pcre-8.38.tar.gz cd pcre-8.38sudo autoreconf -ivf
*(configure要改成777權限)
wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz tar -xvpzf openssl-1.0.2j.tar.gz cd openssl-1.0.2j ./config make
*(config要改成777權限)
cd nginx-1.10.2./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-ipv6 --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-openssl=../openssl-1.0.2j --with-pcre=../pcre-8.38 --with-pcre-jit --with-ld-opt=-ljemalloc \ --add-module=../mod_security/nginx/modsecurity make
*(configure要改成777權限,不要make install)
service nginx stop cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak cp objs/nginx /usr/local/nginx/sbin/nginx service nginx start
/../nginx -V
如圖,原有模塊不變,增長modsecurity成功!
下載地址:https://github.com/SpiderLabs/owasp-modsecurity-crs
將規則目錄 owasp-modsecurity-crs-master 放置 /usr/local/nginx/conf/ 下,
而後將 owasp-modsecurity-crs-master 目錄下的 modsecurity_crs_10_setup.conf.example 更名爲 modsecurity_crs_10_setup.conf 。
複製modsecurity源碼目錄下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目錄下,並將modsecurity.conf-recommended從新命名爲modsecurity.conf 。
編輯modsecurity.conf 文件,將SecRuleEngine
設置爲 on
,並將你須要的規則導入進來:
Include modsecurity-crs/modsecurity_crs_10_setup.conf Include modsecurity-crs/base_rules/modsecurity_crs_35_bad_robots.conf Include modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf Include modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf Include modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf Include modsecurity-crs/base_rules/modsecurity_crs_42_tight_security.conf Include modsecurity-crs/base_rules/modsecurity_crs_45_trojans.conf
*(若是你的網站使用了CDN服務,而且間歇性打不開,可能須要刪除 modsecurity_crs_11_proxy_abuse.conf 這條惡意代理IP、IP黑名單規則)
location \ { ModSecurityEnabled on; ModSecurityConfig modsecurity.conf; ....其餘配置 }
service nginx reload
……
若是***被阻止,恭喜你,成功啓用modsecurity!
其餘、排錯:
· 若是正常的post請求被阻止,可將modsecurity.conf中的 SecRequestBodyAccess
修改成 Off
。
· modsecurity默認的阻止日誌在 /var/log/modsec_audit.log 下,可查看詳細被阻止的緣由和規則,可禁用規則來放行(禁用方法見下文)。
· 若是提示 Audit log: Failed to lock global mutex: Permission denied
你可能須要將modsecurity.conf中的 SecAuditLogType Serial
註釋掉,而後修改/添加如下內容:
SecAuditLog /var/log/modsec_audit.log #(該設置默認是有的,這裏不須要註釋) SecAuditLogType Concurrent SecAuditLogStorageDir /opt/modsecurity/var/audit/ #(該文件夾須要新建,而且必須指定用戶組,例如屬於wwwdata,和nginx中設置的相同)
· 若是正常的post使用302跳轉方法無響應,可屏蔽950922
960034
960032
這幾個規則再試,另外這個現象有時候會伴隨多個問題,例如nginx中也會產生錯誤日誌等,根據官方的說法是modsecurity 2.9.X之前的版本在nginx下是存在bug的,官方github issue中也有不少關於相似的問題,而且官方推薦使用最新的3.0版本,將會對nginx支持更好。
增長白名單方法:
修改 modsecurity.conf ,加入 SecRuleRemoveById
960024
這樣的格式禁用該規則id,也可使用SecRuleRemoveByMs
、 SecRuleRemoveByTag
。
modsecurity owasp詳細規則解釋:
第一部分:基礎規則集
modsecurity_crs_20_protocol_violations.conf HTTP協議規範相關規則
modsecurity_crs_21_protocol_anomalies.conf HTTP協議規範相關規則
modsecurity_crs_23_request_limits.conf HTTP協議大小長度限制相關規則
modsecurity_crs_30_http_policy.conf HTTP協議白名單相關規則
modsecurity_crs_35_bad_robots.conf 惡意掃描器與爬蟲規則
modsecurity_crs_40_generic_attacks.conf 常見的***例如命令執行,代碼執行,注入,文件包含、敏感信息泄露、會話固定、HTTP響應拆分等相關規則
modsecurity_crs_41_sql_injection_attacks.conf SQL注入相關規則(居然有一條MongoDB注入的規則,很全)
modsecurity_crs_41_xss_attacks.conf XSS相關規則
modsecurity_crs_42_tight_security.conf 目錄遍歷相關規則
modsecurity_crs_45_trojans.conf webshell相關規則
modsecurity_crs_47_common_exceptions.conf Apache異常相關規則
modsecurity_crs_49_inbound_blocking.conf 協同防護相關規則
modsecurity_crs_50_outbound.conf 檢測response_body中的錯誤信息,警告信息,列目錄信息
modsecurity_crs_59_outbound_blocking.conf 協同防護相關規則
modsecurity_crs_60_correlation.conf 協同防護相關規則
第二部分:SLR規則集
來自肯定APP的PoC,不會誤報,檢測方法是先檢查當前請求的文件路徑是否出如今data文件中,若出現再進行下一步測試,不然跳過該規則集的檢測
modsecurity_crs_46_slr_et_joomla_attacks.conf JOOMLA應用的各類漏洞規則
modsecurity_crs_46_slr_et_lfi_attacks.conf 各類APP的本地文件包含相關規則
modsecurity_crs_46_slr_et_phpbb_attacks.conf PHPBB應用的各類漏洞規則
modsecurity_crs_46_slr_et_rfi_attacks.conf 各類APP的遠程文件包含相關規則
modsecurity_crs_46_slr_et_sqli_attacks.conf 各類APP的SQL注入相關規則
modsecurity_crs_46_slr_et_wordpress_attacks.conf WORDPRESS應用的各類漏洞規則
modsecurity_crs_46_slr_et_xss_attacks.conf 各類APP的XSS相關規則
第三部分:可選規則集
modsecurity_crs_10_ignore_static.conf 靜態文件不過WAF檢測的相關規則
modsecurity_crs_11_avs_traffic.conf AVS(受權的漏洞掃描器)的IP白名單規則
modsecurity_crs_13_xml_enabler.conf 請求體啓用XML解析處理
modsecurity_crs_16_authentication_tracking.conf 記錄登錄成功與失敗的請求
modsecurity_crs_16_session_hijacking.conf 會話劫持檢測
modsecurity_crs_16_username_tracking.conf 密碼複雜度檢測
modsecurity_crs_25_cc_known.conf CreditCard驗證
modsecurity_crs_42_comment_spam.conf 垃圾評論檢測
modsecurity_crs_43_csrf_protection.conf 與modsecurity_crs_16_session_hijacking.conf聯合檢測,使用內容注入動做append注入CSRF Token
modsecurity_crs_46_av_scanning.conf 使用外部腳本掃描病毒
modsecurity_crs_47_skip_outbound_checks.conf modsecurity_crs_10_ignore_static.conf的補充
modsecurity_crs_49_header_tagging.conf 將WAF規則命中狀況配合Apache RequestHeader指令注入到請求頭中,以供後續應用進一步處理
modsecurity_crs_55_application_defects.conf 安全頭(X-XSS-Protection,X-FRAME-OPTIONS,X-Content-Type-Options)設置,安全Cookie設置(Domain,httponly,secure),字符集設置等規則
modsecurity_crs_55_marketing.conf記錄MSN/Google/Yahoo robot狀況
第四部分:實驗性規則集
modsecurity_crs_11_brute_force.conf 防護暴力破解相關規則
modsecurity_crs_11_dos_protection.conf 防DoS***相關規則
modsecurity_crs_11_proxy_abuse.conf 檢測X-Forwarded-For是不是惡意代理IP,IP黑名單
modsecurity_crs_11_slow_dos_protection.conf Slow HTTP DoS***規則
modsecurity_crs_25_cc_track_pan.conf 檢測響應體credit card信息
modsecurity_crs_40_http_parameter_pollution.conf 檢測參數污染
modsecurity_crs_42_csp_enforcement.conf CSP安全策略設置
modsecurity_crs_48_bayes_analysis.conf 使用外部腳本採起貝葉斯分析方法分析HTTP請求,區分正常與惡意請求
modsecurity_crs_55_response_profiling.conf 使用外部腳本將響應體中的惡意內容替換爲空
modsecurity_crs_56_pvi_checks.conf使用外部腳本檢測 REQUEST_FILENAME是否在osvdb漏洞庫中
modsecurity_crs_61_ip_forensics.conf 使用外部腳本收集IP的域名、GEO等信息
modsecurity_crs_40_appsensor_detection_point_2.0_setup.conf APPSENSOR檢測設置文件
modsecurity_crs_40_appsensor_detection_point_3.0_end.conf APPSENSOR檢測設置文件
modsecurity_crs_16_scanner_integration.conf 對掃描器設置IP白名單,並調用掃描器API來進行檢測
modsecurity_crs_46_scanner_integration.conf
使用modsecurity_crs_40_appsensor_detection_point_2.0_setup.conf,modsecurity_crs_40_appsensor_detection_point_3.0_end.conf 來跟蹤XSS漏洞參數與SQLI漏洞參數
modsecurity_crs_40_appsensor_detection_point_2.1_request_exception.conf 使用外部腳本檢測請求方法,參數個數,參數名字,參數長度,參數字符等限制
modsecurity_crs_40_appsensor_detection_point_2.9_honeytrap.conf 使用隱藏參數設置蜜罐