nginx使用

                                 Nginx javascript

     Nginx是一款面向性能設計的HTTP服務器,相較於Apache、lighttpd具備佔有內存少,nginx不採用每客戶機一線程的設計模型,而是充分使用異步邏輯,削減了上下文調度開銷,因此併發服務能力更強。總體採用模塊化設計,有豐富的模塊庫和第三方模塊庫,配置靈活。 在Linux操做系統下,nginx使用epoll事件模型,得益於此,nginx在Linux操做系統下效率至關高。php

     Nginx的優勢:css

     Nginx做爲http服務器,的特徵html

  • 處理靜態文件,索引文件以及自動索引,打開文件描述符緩衝。前端

  • 無緩存的反向代理加速,簡單的負載均衡和容錯。java

  • FastCGI,簡單的負載均衡和容錯node


Nginx服務器的類型linux

  1.  web服務器:web服務器用於提供http的訪問。nginx

  2. 應用程序服務器:客戶端回話管理,業務邏輯管理,數據操做git

  3. 反向代理

  4. 後臺代理

  5. 防火牆

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 先查看原來都有哪些模塊。
w1

而後把上面這些先複製下來以做備用。

第二步:安裝依賴,阿里雲的服務器能夠直接使用yum安裝或者升級

yum install -y gcc make automake autoconf libtool
yum install -y pcre pcre-devel libxml2 libxml2-devel curl curl-devel httpd-devel
第三步:下載編譯安裝modsecurity
git clone https://github.com/SpiderLabs/ModSecurity.git mod_security
cd mod_security
./autogen.sh  
./configure --enable-standalone-module
make

*(爲了不出錯,可先將autogen.sh的權限改爲777)

第四步:下載nginx
wget http://www.nginx.org/download/nginx-1.10.2.tar.gz

找到nginx-1.10.1/auto/lib/openssl/conf文件,將第31-35行編輯爲
w2
*(爲下面編譯openssl作準備)

第五步:從新編譯pcre
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權限)

第六步:從新編譯openssl
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權限)

第七步:編譯nginx,增長modsecurity模塊以及原有模塊。
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)

第八步:拷貝編譯後的nginx文件覆蓋現有的nginx文件
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成功!

第十步:下載OWASP規則

下載地址: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 。

第十一步:啓用OWASP規則

複製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黑名單規則)

第十二步:配置nginx
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 使用隱藏參數設置蜜罐

相關文章
相關標籤/搜索