nginx優化_安全方面的優化

1.1 Nginx優化分類

安全優化(提高網站安全性配置)php

性能優化(提高用戶訪問網站效率)html

1.2 Nginx安全優化

1.2.1 隱藏nginx版本信息優化

官方配置參數說明:http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokensnginx

官方參數:web

Syntax:  server_tokens on | off | build | string;
Default: server_tokens on;
Context: http, server, location

配置舉例:vim

[root@web01 ~]# cat /application/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        off;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    server {
        listen       80;
        server_name  www.nmtui.com;
        server_tokens off;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        access_log  logs/access_www.log  main;
    }
}

測試結果:安全

[root@web01 ~]# curl -I 10.0.0.8
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 01 Nov 2017 18:32:40 GMT
Content-Type: text/html
Content-Length: 10
Last-Modified: Wed, 25 Oct 2017 01:20:56 GMT
Connection: keep-alive
ETag: "59efe6f8-a"
Accept-Ranges: bytes

1.2.2 修改nginx版本信息

修改版本信息須要修改程序源文件信息性能優化

修改內核信息服務器

[root@web01 nginx-1.10.2]# vim  src/core/nginx.h
# ···
 13 #define NGINX_VERSION      "1.0"
 14 #define NGINX_VER          "clsn/" NGINX_VERSION
 22 #define NGINX_VAR          "clsn"
# ···

修改頭部信息cookie

[root@web01 nginx-1.10.2]# vim  src/http/ngx_http_header_filter_module.c 
# ···
 49 static char ngx_http_server_string[] = "Server: clsn" CRLF;
# ···

修改錯誤頁顯示網絡

[root@web01 nginx-1.10.2]# vim src/http/ngx_http_special_response.c 
# ···
# 此處能夠不修改
 21 static u_char ngx_http_error_full_tail[] =
 22 "<hr><center>" NGINX_VER "</center>" CRLF
 23 "</body>" CRLF
 24 "</html>" CRLF
 25 ;
# ···
 28 static u_char ngx_http_error_tail[] =
 29 "<hr><center>clsn</center>" CRLF
 30 "</body>" CRLF
 31 "</html>" CRLF
 32 ;
# ···

修改完成後從新編譯

[root@web01 nginx-1.10.2]# ./configure  --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module

重啓服務

[root@web01 nginx-1.10.2]# /etc/init.d/nginx restart

訪問測試是否修改爲功

[root@web01 ~]# curl -I 127.0.0.1 
HTTP/1.1 200 OK
Server: clsn
Date: Wed, 01 Nov 2017 19:05:43 GMT
Content-Type: text/html
Content-Length: 10
Last-Modified: Wed, 25 Oct 2017 01:20:56 GMT
Connection: keep-alive
ETag: "59efe6f8-a"
Accept-Ranges: bytes

1.2.3 修改worker進程的用戶

第一種方法:利用編譯安裝配置參數,設定nginx默認worker進程用戶

useradd -s /sbin/nologin -M www
./configure --user=www --group=www

第二種方式:編寫nginx服務配置文件,設定nginx默認worker進程用戶

官方配置參數說明:http://nginx.org/en/docs/ngx_core_module.html#user

Syntax:user user [group];
Default: user nobody nobody;
Context: main

配置舉例:

[root@web02 conf]# cat nginx.conf
user  www www;          # 主區塊添加user參數
worker_processes  1;
events {
    worker_connections  1024;
}

查看是否生效

[root@web01 nginx-1.10.2]# ps -ef|grep nginx
root      16987      1  0 15:14 ?        00:00:00 nginx: master process nginx
clsn    18484  16987  0 15:22 ?        00:00:00 nginx: worker process
root      18486   9593  0 15:22 pts/0    00:00:00 grep --color=auto nginx

1.2.4 上傳文件大小的限制(動態應用)

默認語法說明:

syntax:client_max_body_size size;    #<==參數語法
default:client_max_body_size 1m;    #<==默認值是1m
context:http,server,location        #<==能夠放置的標籤段

舉例配置:

http {
 sendfile        on;
 keepalive_timeout  65;
 client_max_body_size 8m;    # 設置上傳文件最大值8M
}

1.2.5 站點 Nginx站點目錄及文件URL訪問控制

   01. 根據目錄或擴展名,禁止用戶訪問指定數據信息

location ~ ^/images/.*\.(php|php5|sh|pl|py|html)$ 
    { 
        deny all;
    } 
location ~ ^/static/.*\.(php|php5|sh|pl|py)$ 
    { 
        deny all;
    } 
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ 
    { 
        deny all;
    } 

   02. 當訪問禁止的數據信息時,進行頁面跳轉

Nginx下配置禁止訪問*.txt和*.doc文件。

實際配置信息以下:

location ~* \.(txt|doc)$ {
    if (-f $request_filename){
    root /data/www/www;
    #rewrite …..能夠重定向到某個URL
    break;
    }
}
location ~* \.(txt|doc)${
    root /data/www/www;
    denyall;
}

   03. 根據IP地址或網絡進行訪問策略控制

location / { 
    deny 192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    deny all;
}

   04. 採用if判斷方式,進行訪問控制

if ($remote_addr = 10.0.0.7 ){
        return 403;
 }

1.2.6 配置Nginx,禁止非法域名解析訪問企業網站

第一種方式:配置一個server虛擬主機區塊,放置在全部server區塊最前面

server {
   listen 80;
   server_name - ;
   return 501;
}

第二種方式:將計就計,經過你的域名訪問時候,自動跳轉到個人域名上

server {
   listen 80 default_server;
   server_name _;
   rewrite ^(.*) http://www.nmtui.com/$1 permanent;
}
if ($host !~ ^www\.nmtui\.com$)
{
    rewrite ^(.*) http://www.nmtui.com/$1 permanent;
}

1.2.7 Nginx圖片及目錄防盜鏈解決方案

   什麼是資源盜鏈 ?

   簡單地說,就是某些不法網站未經許可,經過在其自身網站程序裏非法調用其餘網站的資源,而後在本身的網站上顯示這些調用的資源,達到填充自身網站的效果。

實現盜鏈過程:

01. 真正的合法網站(盜鏈的目標)  web01   www.nmtui.com www站點目錄有一個oldboy.jpg圖片

    # 配置靜態虛擬主機
   server {
     listen       80;
     server_name  www.nmtui.com;
     location / {
         root   html/www;
         index  index.html index.htm;
     }
   # 確認生成盜鏈文件

   02. 不合法的網站(真正盜鏈網站)  www.daolian.com

   # 編寫一個html盜鏈文件
    <html>
    <head>
       <title>慘綠少年</title>
    </head>
    <body bgcolor=green>
       慘綠少年的博客!
    <br>個人博客是
    <a
     href="http://www.nmtui.com" target="_blank">博客地址
    </a>
    <img src="http://www.nmtui.com/clsn.jpg">
    </body>
    </html>

    編寫盜鏈虛擬主機

    server {
            listen       80;
            server_name  www.daolian.org;
            location / {
                root   html;
                index  index.html index.htm;
            }   
        }

         至此就實現了盜鏈。

03 常見防盜鏈解決方案的基本原理

1)     根據HTTP referer實現防盜鏈

    利用referer,而且針對擴展名rewrite重定向,下面的代碼爲利用referer且針對擴展名rewrite重定向,即實現防盜鏈的Nginx配置。

    location ~* /\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
        root  html/www;
        valid_referers none blocked *.nmtui.com nmtui.com;
    if ($invalid_referer){ 
        rewrite ^/  http://www.nmtui.com/img/nolink.jpg;
      } 
    } 

         設置expires的方法以下:

    [root@clsn www]# cat /application/nginx/conf/extra/www.conf 
        server {
            listen            80;
            server_name        www.nmtui.com;
                root        html/www;
                index        index.html index.htm;
                access_log    logs/www_access.log main;
    #Preventing hot linking of images and other file types
    location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
        valid_referers none blocked server_names *.nmtui.com nmtui.com;
        if ($invalid_referer){
            rewrite ^/ http://www.nmtui.com/img/nolink.jpg;
        }
        access_log off;
        root html/www;
        expires 1d;
        break;
       }
    }

2) 根據cookie防盜鏈

3) 經過加密變換訪問路徑實現防盜鏈

4) 在全部網站資源上添加網站信息,讓盜鏈人員幫你作推廣宣傳

1.2.8 NGINX錯誤頁面友好顯示

範例1:對錯誤代碼403實行本地頁面跳轉,命令以下:

###www
    server {
        listen       80;
        server_name  www.nmtui.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        error_page  403  /403.html;    #<==當出現403錯誤時,會跳轉到403.html頁面
    }

# 上面的/403.html是相對於站點根目錄html/www的。

範例2:50x頁面放到本地單獨目錄下,進行優雅顯示。

# redirect server error pages to the static page /50x.html
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /data0/www/html;
}

範例3:改變狀態碼爲新的狀態碼,並顯示指定的文件內容,命令以下:

error_page 404 =200 /empty.gif;
    server {
        listen       80;
        server_name www.nmtui.com;
        location / {
            root   /data0/www/bbs;
            index  index.html index.htm;
            fastcgi_intercept_errors on;
            error_page  404 =200    /ta.jpg;
            access_log  /app/logs/bbs_access.log  commonlog;
        }
}

範例4:錯誤狀態碼URL重定向,命令以下:

server {
        listen       80;
        server_name www.nmtui.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        error_page   404  https://clsn.cnblogs.com;
#<==當出現404錯誤時,會跳轉到指定的URL https://clsn.cnblogs.com頁面顯示給用戶,這個URL通常是企業另外的可用地址
            access_log  /app/logs/bbs_access.log  commonlog;
        }
}

1.2.9 Nginx站點目錄文件及目錄權限優化

服務器角色

權限處理

安全係數

動態Web集羣

目錄權限755

文件權限644

所用的目錄,以及文件用戶和組都是root

環境爲Nginx+PHP   文件不能被改,目錄不能被寫入,安全係數10

static圖片集羣

目錄權限755

文件權限644

所用的目錄,以及文件用戶和組都是root

環境爲Nginx    文件不能被改,目錄不能被寫入,安全係數10

上傳upload集羣

目錄權限755

文件權限644

所用的目錄,以及文件用戶和組都是root

特別:用戶上傳的目錄設置爲755,用戶和組使用Nginx服務配置的用戶    

文件不能被改,目錄不能被寫入,可是用戶上傳的目錄容許寫入文件且須要經過Nginx的其餘功能來禁止讀文件,安全係數8

1.2.10 Nginx防爬蟲優化

範例1:阻止下載協議代理,命令以下:

## Block download agents ##
if ($http_user_agent ~* LWP::Simple|BBBike|wget)
 {
    return 403;
}

範例2:添加內容防止N多爬蟲代理訪問網站,命令以下:

這些爬蟲代理使用「|」分隔,具體要處理的爬蟲能夠根據需求增長或減小,添加的內容以下:

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo!Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot")
 {
return 403;
}

1.2.11 利用Nginx限制HTTP的請求方法

#Only allow these request methods

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 501;
}

#Do not accept DELETE,SEARCH and other methods

1.2.12 使用普通用戶啓動nginx

一、切換到普通用戶家目錄下,建立nginx所需文件

[nginx@web01 ~]$ mkdir -p blog/{conf,logs,html}
[nginx@web01 ~]$ cd blog/ 
[nginx@web01 blog]$ cp /application/nginx/conf/nginx.conf.default  ./conf/
[nginx@web01 blog]$ grep -vE "^$|#" conf/nginx.conf.default  >  conf/nginx.conf
[nginx@web01 blog]$ cp /application/nginx/conf/mime.types conf/

二、編寫配置文件

[nginx@web01 ~]$ cat blog/conf/nginx.conf
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
error_log  /home/nginx/blog/logs/error.log;
user inca inca;
pid       /home/nginx/blog/logs/nginx.pid;
events {
    use epoll;
    worker_connections  1024;
}
http {
    include      mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    server {
        listen       8080;
        server_name  www.etiantian.org;
        root   /home/nginx/blog/html;
        location / {
            index  index.html index.htm;
                }
        access_log  /home/nginx/blog/logs/web_blog_access.log  main;
            }
}

         注意:普通用戶不能使用知名端口,須要使用其餘端口啓動服務

三、檢查配置文件語法,並啓動nginx服務

/application/nginx/sbin/nginx -t -c /home/nginx/blog/conf/nginx.conf
或
/application/nginx/sbin/nginx -c /home/nginx/blog/conf/nginx.conf &>/dev/null &

         注意:忽略一些不正確的輸出信息

相關文章
相關標籤/搜索