nginx的配置

 

所属

功能

参数名称

参数说明

Main 

核心功能模块core-function

daemon off;

前台运行

user nginx;

防黑改为特殊用户

worker_processes auto;

进程数量

error_log  logs/error.log;

错误日志

pid       logs/nginx.pid;

pid文件位置

Events

核心功能模块

events {

    use epoll;

    worker_comnections 1024;

}

http:nginx.org/en/docs/ngx_core_module.html(参)

每个worker进程支持的最大连接数

1024:ulimit -HSn 执行结果

Nginx作Web服务器负载均衡、Squid、Nginx反向代理后不能取到客户端的真实IP

原因:由于在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端的IP

通过$remote_addr变量拿到的将是反向代理服务器的IP 。

但是,反向代理服务器在转发请求的HTTP头信息中,增加X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Http

 

 

 

 

 

 

 

 

 

 

 

 

Http

 

 

 

 

 

 

 

 

 

 

 

 

 

Http

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Http

 

 

 

 

 

 

 

 

 

 

 

 

 

Http

 

 

 

 

 

 

 

 

 

日志规则

http {

 

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

 

 

解释:

$remote_addr和$http_x_forwarded_for用于记录IP地址;

$remote_user用于记录远程客户端用户名称;

$time_local用于记录访问时间与时区;

$request用于记录请求URL与HTTP协议;

$status用于记录请求状态,例如成功时状态为200,页面找不到时状态为404;

$body_bytes_sent用于记录发送客户端的文件主体内容大小;

$http_referer用于记录是从哪个页面链接访问过来的;

$http_user_agent用于记录客户浏览器的相关信息。

$ssl_protocol            

SSL协议版本                                 

$ssl_cipher              

交换数据中的算法                            

$upstream_addr           

后台upstream的地址

$request_time            

整个请求的总时间                            

$upstream_response_time  

请求过程中,upstream响应时间

常规参数

include       mime.types;

文件扩展名与类型映射表

default_type  application/octet-stream;

默认文件类型

sever_tokens off;

隐藏版本号信息

clie_max_body_size 10m;

设置上传文件大小

access_log off;

关闭访问日志

imit模块

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

limit_conn_zone $binary_remote_addr zone=addr:10m;

 

 

可防范一定量的DDOS攻击#用来存储session会话的状态,例:是为session分配一个名为one10M的内存存储区,限制了每秒只接受一个ip的一次请求 1r/s

 

 

 

sendfile on;

高效传输

sendfile on;

高效传输

tcp_nopush on;   (选项对于wwwftp等大文件传输、文件服务器)

解决网络和磁盘IO阻塞tcp_crok

#tcp_nodelay on; (upstream发送响应到客户端时会启用

解决网络和磁盘IO阻塞 立即发送

 

发送一系列当作单一消息的数据之前设置TCP_CORK,而在发送应立即发出的短消息之前设置TCP_NODELAY

如需要提供网络的传输效率,应该减少小包的传输,使用TCP_CORK来做汇总传输,在利用sendfile来提高效率;

但如果是交互性的业务,那应该让任意小包可以快速传输,关闭Nagle算法,提高包的传输效率。

TCP_CORK优化了传输的bits效率,tcp_nodelay优化了传输的packet效率。

设定请求缓存

server_names_hash_bucket_size 128;

 

server_names_hash_max_size 512;

 

client_header_buffer_size 512k;

 

large_client_header_buffers 4 512k;

 

 

 

 

超时链接

keepalived_timeout 60;

保护系统资源;减少维护成本

防止恶意攻击;lnmp常用

client_header_timeout 15

设置读取客户端请求头数据的超时时间

client_body_timeout 15

设置读取客户端请求主体的超时时间

send_timeout 25:

用户指定响应客户端的超时时间;仅仅为两次成功握手后的一个超时

Nginx_Fastcgi(配合PHP引擎动态服务)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Nginx

_Fastcgi

PHP

fastcgi_connect_timeout

 

表示nginx服务器和后端FastCGI服务器连接的超时时间,默认值为60s,这个参数通常不要超过75s,因为建立的连接越多消耗的资源就越多

fastcgi_send_timeout;

 

设置nginx允许FastCGI服务返回数据的超时时间,即在规定时间之内后端服务器必须传完所有的数据,否则,nginx将断开这个连接,默认值为60s

fastcgi_read_timrout

 

设置NginxFastCGI服务端读取响应信息的超时时间。表示建立连接成功后,nginx等待后端服务器的响应时间,是nginx已经进入后端的排队之中等候处理的时间

fastcgi_buffer_size

 

这是nginx fastcgi的缓冲区大小参数,设定用来读取FastCGI服务端收到的第一部分响应信息的缓冲区大小,这里的第一部分通常会包含一个小的响应头部,默认情况,这个参数大小是由fastcgi_buffers指定的一个缓冲区的大小

fastcgi_buffers

 

读取FastCGI服务端收到响应信息的缓冲区大小数量;默认值fastcgi_buffers 8 4|8k

PHP脚本产生页面256lb,分配464kb的缓存区;脚本所产生的页面256kb值设为“16 16k”“4 64k”

fastcgi_busy_buffers_size

 

设置系统忙时使用fastcgi_buffers大小,官方推荐fastcgi_buffers*2;默认fastcgi_busy_buffers_size 8k|16k

fastcgi_temp_file_write_size

 

fastcgi临时文件的大小,可设置128-256k

fastcgi_cache oldboy_nginx

 

表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,有效降低CPU的负载,并且防止502但是开启缓存也会引起其他问题,要根据具体情况选择

fastcgi_cache_path

示例:fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zong=nginx_fcgi_cache:512m inavtive=1d max_size=40g;

 

fastcgi_cache缓存目录,可以设置目录哈希层级。比如2:2会生成256*256个子目录,keys_zene是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放入内存,提高访问速度)inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先卸载fastcgi_temp_path再移到fastcgi_cache_path。所以这两个目录最好在同一个分区

fastcgi_cache_vaild

示例:fastcgi_cache_valid 2000 302 1h;

示例:fastcgi_cache_valid 301 1d;

 

用来指定应答代码的缓存时间,实例中的值将2000302应答缓存一个小时

304应该缓存1;还可以设置缓存1分钟(1m

fastcgi_cache_min_user

示例:fastcgi_cache_min_user 1;

设置请求几次之后响应将被缓存。

fastcgi_cache_user_stale

示例:fastcgi_cache_use_stale error timeout invaild_header http_500;

定义那些情况下用过期缓存

fastcgi_cache_key

示例:fastcgi_cache_key $request_method://$host$request_uri;
fastcgi_cache_key http://$host$request_uri;

 

 

定义fastcgi_cachekey,示例中就以请求的URI作为缓存的keynginx会取这个keymd5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取响应的位置作为目录。注意一定要加上$request_method作为cache key,否则如果HEAD类型的先请求会导致后面的GET请求返回为空

gzip

gzip on;

压缩功能依赖ngx_http_gzip_module

gzip_min_length 1k;

 

设置允许要锁的页面最小字节数,页面字节数从header头的content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置1k不然越压越大

gzip_buffers 4 16k

 

压缩缓冲区大小,申请4各单位为16k的内存作为压缩结果流缓存,默认是申请与原始数据大小相同的内存空间来存储gzip压缩结果

gzip_http_version 1.1;

识别http版本协议 默认即可

gzip_comp_level 2;

 

1压缩比最小、处理速度最快,9压缩比最大、处理最慢,传输速度最快、CPU消耗最多。

gzip_types  text/css text/xml application/javascripts;

指定压缩类型,'text/html'总被压缩的媒体类型

gzip_vary on;

让前端的缓存服务器缓存经过Gzip压缩的页面

 

gzip_disable “MSIE [1-6].”

是用正则表达式来指定某些不需要gzip压缩的浏览器;禁止IE浏览器的1-6进行压缩

upstream模

upstream backend_server {

    server   10.254.244.20:81 weight=1 max_fails=2 fail_timeout=30s;

    server   10.254.242.40:81 weight=1 max_fails=2 fail_timeout=30s;

}

 

#设置由 fail_timeout 定义的时间段内连接该主机的失败次数,以此来断定 fail_timeout 定义的时间段内该主机是否可用。默认情况下这个数值设置为 1。零值的话禁用这个数量的尝试。

#设置在指定时间内连接到主机的失败次数,超过该次数该主机被认为不可用。

#这里是在30s内尝试2次失败即认为主机不可用

 

 

Include ../module/*.conf

引用当前目录的上级目录module下基于域名的的配置文件

 

Nginx安全与优化

 

 

 

 

 

 

 

 

 

server区

基于域名的虚拟主机

 

server

server {

      listen         80:

      server_name   www.xxx.com;

提供服务器的端口,默认80

提供服务器的域名主机名

      index  index.html index.htm index.php;

首页排序

      root  /data0/abc;

     # root  /usr/local/tomcat/ROOT/

站点根目录

 

error_page 500 502 404 /templates/kumi/phpcms/404.html;  

错误页面

      location / {

            root   D:/phpweb/wwwroot;

            index  index.php index.html index.htm;

            rewrite ^(.*)/t(\d+)\.html$ $1/index.php?t=3 last;

        }

要将http://dede.com/index.php?t=3用伪静态规则改写成http://dede.com/t3.html

仔细观察 rewrite ^(.*)/t(\d+)\.html$ $1/index.php?t=3 last;其实感觉nginx的伪静态规则蛮好写的。就是用正则的基础上,一个rewrite来声明,然后^是伪静态规则开头,(.*)匹配任意字符,这里匹配的就是域名了,t就是你在这里想加的字符,如你可以加appleorange这样的分类名了,(\d+)匹配的是数字,\.html匹配的是后缀,$就是正则匹配的结束。后面半部分就是要改写的url了,用$1打头,表示域名,/index.php?t=3就是要改写的URL,用last;结束即可。

指定路径禁止访问

     location ~ /.svn/ {

          deny all;

         }

增加缓存

     location~ .*\.(js|css)?$ {

       expires      30d; #客户端缓存上述js,css数据30

          }

fastcgi

   location ~ /.svn/ {
       deny all;
            location ~ \.php$  
             {  #符合php扩展名的请求调度到fcgi server  
              fastcgi_pass  127.0.0.1:9000;  #抛给本机的9000端口
              fastcgi_index index.php;    #设定动态首页
              include fcgi.conf;
             }
            allow   219.237.222.30 ;  #允许访问的ip
              deny    all;            #禁止其他ip访问
            }

PV

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)?$ {

        access_log off;

}

于负载均衡器健康检查节点或某些特定文件(比如图片、jscss)的日志,一般不需要记录下来,因为在统计PV时是按照页面计算的。而且日志写入频繁会大量消耗磁盘I/O,降低服务的性能。

 

 

 

 

 

 

Nginx

URL

访

location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$

        {

          deny all;

        }

location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$

        {

           deny all;

        }

location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$

    {

        deny all;

禁止访问上传资源目录下的PHPshellperlPython程序文件,这样用户即使上传了木马文件也没法去执行,从而加强了网站的安全。

访

location ~*\.(txt|doc)${

    if (-f $request_filename) {

    root /data/www/www;

    #rewrite ....可以重定向某个URL

    break;

  }

}

location ~*\.(txt|doc)${

    root /data/www/www;

    deny all;

}

nginx下配置禁止访问*.txt对上述限制需要写在php匹配的前面

  

location ~.*\.(php|php5)?$

{

 fastcgi_pass 127.0.0.1:9000

 fastcgi_index index.php

 include fcgi.conf;

}

限制网站来源IP访问

location ~ ^/docker/ {

allow 202.111.12.211;

deny all;

}

禁止某目录让外界访问,但允许某IP访问该目录,切支持PHP解析

ip

方法1:使用if来控制。

        if ( $remote_addr = 10.0.0.7 ) {

        return 403;

        }

if ( $remote_addr = 218.247.17.130 ) {

        set $allow_access_root 'true';

}

 

过滤只允许GETHEADPOST方法请求

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

        return 444;

    }

 

阻止User-Agents,如扫描器,机器人以及滥用你服务器的垃圾邮件发送者

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

        return 405;

    }

 

防范小流量的攻击,客户端的IP对一个页面进行不停地访问,没有记录浏览器的信息

 if ( $http_user_agent ~* "Windows 5.1" ) {

        return 445;

    }

根据官方文档的介绍“非http标准的返回码444,它可以用来关闭连接”,这样的话他就不会占用我们服务器的任何资源,这三个4真是把访问杀得很彻底

访

单目录

 location ~ ^/(static)/ {

        deny all;

}

多目录

location ~ ^/static {

        deny all;

}

禁止访问目录并返回指定的http状态码

location /admin/ { return 404; }

location /templates/ { return 403; }

Nginx禁止非法域名解析访问企业网站

server {

listen 80 default_server;

server_name _;

return 501;

}

让使用IP访问的网站用户,或者而已解析域名的用户,收到501错误

或:通过301跳转到主页

301-rewrite跳转到公司网站

要放在第一个server

if ($host !~ ^www/.oldboy123/.com$){

    rewrite ^(.*)  http://www.oldboy123.com$1 permanent;

}

server {

listen 80 default_server;

server_name _;

rewrite ^(.*) http://www.oldboy123.com/$1 permanent;

}

 

 

 

 

Nginx

防盗链

HTTP Refere

 

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                       '$status $body_bytes_sent "$http_referer" '

                       '"$http_user_agent" "$http_x_forwarded_for"';

 

#--> $http_referer

HTTP协议中,有一个表头字段叫referer,使用URL格式来表示哪里的链接用了当前网页的资源。通过referer可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来不是本站,马上进行阻止或返回指定的页面。

流量类

<script>document.cookie="Cache=av;domain.com;path=/";</script>

 

对于视频这种占用流量较大的业务根据实现防盗链是比较困难的,此时可以采用Cookie技术,来解决对FlashWindows Media视频等防盗链问题。

Active X插件不传递Referer,但会传递Cookie。可以在显示Active X的页面的 标签内嵌入一段代码,可以用JavaScript 代码来设置一段CookieCache=av

然后就可以通过各种手段来判断这个Cookie的存在以及验证其值的操作了

下载类

 

<?php

$secret = "oldboy"; //加密字符串与lighttpd.conf一致

$uri_prefix = "mp4"; //虚拟路径、前缀与lighttpd.conf一致

$file = "/test.mp4"; //实际文件名,必须加"/"斜杠

$timestamp = time(); //current timestamp

$t_hex = $spcintf("%08%x",$timestamp);

$m = md5($secret.$file.$t_hex);

printf('%s',$uri_prefix,$m,$t_hex, $file,$file); //生成url地址串

?>

下载类业务的网站

通过加密变换访问路径

 

此方法比较适合视频以及下载类业务的网站。例如:Lighttpd 有类似的插件mod_secdownload来实现此功能,现在服务器配置此模块,设置一个固定用于加密的字符串比如oldboy123,然后设置一个url前缀,比如/abc/,再设置一个过期时间,比如1小时,然后写一段PHP代码,例如加密字符串和系统时间等通过md5算法生产一个加密字符串,最终获取到的文件的URL连接种会带由一个时间戳和一个加密字符的md5数值,在访问时系统会对这两个数据进行验证。如果时间不在预期的时间段内(如1小时)则失效;如果时间戳符合条件,但是加密的字符串不符合条件也失效,从而达到防盗链的效果。

 

http://nginx.org/en/docs/http/ngx_http_secure_link_module.html 

ngx_http_secure_link_module 防盗链模

产品设计

加水印加版权

 

nginx防盗链

location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {

    valid_referers none blocked *.oldboy123.org  oldboy123.org;

    if ($invalid_referer) {

        rewrite ^/ http://bbs.oldboy123.org/img/nolink.gif;

    }

    root html/www;

}

 

利用referer并且针对扩展名rewrite重定向

提示:要根据主机公司实际业务(是否有外联的合作),进行域名设置。 
     针对防盗链中设置进行解释 
     jpg png swf flv rar zip 表示对jpggifzip为后缀的文件实行防盗链处理 
     *.oldboy123.org oldboy123.org表示这个请求可以正常访问上面指定的文件资源 
     if{}中内容的意思是:如果地址不是上面指定的地址就跳转到通过rewrite指定的地址,也可直接通过retum返回403错误 
     return 403为定义的http返回状态码 rewrite ^/ http://bbs.oldboy123.org/img/nolink.gif;表示显示一张防盗链图片 
     access_log off;表示不记录访问日志,减轻压力 ;expires 3d指的是所有文件3天的浏览器缓存

 

 

 

 

404

优雅404

 

 

 

 

 

server {

        listen       80;

        server_name  www.etiantian.org;

        location / {

            root   html/www;

            index  index.php index.html index.htm;

            error_page 404           /404.html

#当页面出现404错误时,会跳转404.html页面显示给用户

        }

对错误代码404实行本地页面优雅显示

重定向

另一种 重定向到一个地址

 error_page   404  http://www.oldboy123.com;

 #error_page  404              /404.html;

error_page   404  http://www.oldboy123.com;

可以写多行。

 error_page   404              /404.html;

error_page   500 502 503 504  /50x.html;

 

阿里门户网站天猫的Nginx优雅显示配置案例如下:

error_page   500 501 502 503 504 http://err.tmall.com/error2.html;

error_page 400 403 404 405 408 410 411 412 413 414 415 http://err.tmall.com/error1.html;

对错误代码404实行本地页面重定向

 

 

 

 

Nginx

user-agents

## Block download agents ##

location ~^/(images)/ {

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

            return 403;

     }

}

我们可以根据客户端的user-agents信息,轻松地阻止爬虫取我们的网站防爬虫 
范例:阻止下载协议代理

 

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;

}

添加内容防止N多爬虫代理访问网站

还可以加一层location更具体的限制文件名

 

if ($http_user_agent ~* "Firefox|MSIE")

{

rewrite ^(.*) http://blog.etiantian.org/$1 permanent;

}

测试禁止不同的浏览器软件访问

如果浏览器为Firefox或者IE就会跳转到http:blog.etiantian.org

Nginx

Nginx

HTTP

#Only allow these request methods

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

         return 501;

     }

location ~^/(images)/ {

     if ($request_method ~* ^(GET)$ ) {

         return 501;

     }

}

## Only allow GET request methods ##

     if ($request_method ~* ^(GET)$ ) {

         return 501;

     }

HTTP最常用的方法为GET/POST,我们可以通过Nginx限制http请求的方法来达到提升服务器安全的目的,

 例如,让HTTP只能使用GETHEADPOST方法配置如:

设置对应的用户相关权限,这样一旦程序有漏洞,木马就有可能被上传到服务器挂载的对应存储服务器的目录里,虽然我们也做了禁止PHPSHPLPY等扩展名的解析限制,但是还是会遗漏一些我们想不到的可执行文件。对于这种情况,该怎么办捏?事实上,还可以通过限制上传服务器的web服务(可以具体到文件)使用GET方法,来达到防治用户通过上传服务器访问存储内容,让访问存储渠道只能从静态或图片服务器入口进入。例如,在上传服务器上限制HTTPGET

 

nginx_http_limit_conn_module

 

 

 

 

 

 

 

 

Nginx

 

 

 

 

 

 

imit_conn参数:

语法:limit_conn zone number;

上下文:httpserverlocation

配置文件如下:

[root@oldboy ~]# cat /application/nginx/conf/nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

 

    limit_conn_zone $binary_remote_addr zone=addr:10m;

 

    server {

        listen       80;

        server_name   www.etiantian.org;

        location / {

            root   html;

            index  index.html index.htm;

            limit_conn addr 1; #<==限制单IP的并发连接为1

        }

    }

}

还可以设置某个目录单IP并发连接数

         location /download/ {

            limit_conn addr 1;

        }

限制单IP的并发连接

在客户端使用Apacheab测试工具进行测试 
执行ab -c 1 -n 10 http://10.0.0.3进行测试 
注意:-c并发数、-n请求总数,10.0.0.3nginxIP地址

 

 

 

 

 

 

 ngx_http_limit_req_module

 

Nginx

Nginx

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

#<==以请求的客户端IP作为key值,内存区域命名为one,分配10m内存空间,访问速率限制为11次请求(request)

    server {

        listen       80;

        server_name   www.etiantian.org;

        location / {

            root   html;

            index  index.html index.htm;

            limit_req zone=one burst=5;

#<==使用前面定义的名为one的内存空间,队列值为5,即可以有5个请求排队等待。

        }

    }

}

用限制每个IP访问定义key的请求速率。

以请求的客户端IP作为key值,内存区域命名为one,分配10m内存空间,访问速率限制为11次请求(request)

 

 

 

Nginx

 

 

 

访

 

 

 

location ~ ^/list {

         #如果后端的服务器返回502504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。

         proxy_next_upstream http_502 http_504 error timeout invalid_header;

         proxy_cache cache_one;

         #对不同的HTTP状态码设置不同的缓存时间

         proxy_cache_valid  200 301 302 304 1d;

         #proxy_cache_valid  any 1d;

         #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内

         proxy_cache_key $host$uri$is_args$args;

         proxy_set_header Host  $host;

         proxy_set_header X-Forwarded-For  $remote_addr;

         proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";

         #proxy_ignore_headers Set-Cookie;

         #proxy_hide_header Set-Cookie;

         proxy_pass http://backend_server;

         add_header      Nginx-Cache     "$upstream_cache_status  from  km";

          expires      1d;

        }

access_log  /data1/logs/abc.com.log access;    #nginx访问日志

}

 

 

 

  proxy_connect_timeout   60s;  # nginx跟后端服务器连接超时时间(代理连接超时)

proxy_send_timeout      90s;  # 后端服务器数据回传时间(代理发送超时)

  proxy_read_timeout      90s;  # 连接成功后,后端服务器响应时间(代理接收超时)

  proxy_buffer_size        4k;  # 设置代理服务器(nginx)保存用户头信息的缓冲区大小

  proxy_buffers         4 32k;  # proxy_buffers缓冲区,网页平均在32k以下的设置

  proxy_busy_buffers_size 64k;  # 高负荷下缓冲大小(proxy_buffers*2)

  proxy_temp_file_write_size 64k; # 设定缓存文件夹大小,大于这个值,将从upstream服务器传

proxy_set_header X-Forwarded-For $clientRealIp   #取得原始用户的IP地址(针对首层代理)

proxy_set_header X-Real-IP $proxy_protocol_addr; # haproxy 传递RealIP 443

proxy_set_header X-Forwarded-For $proxy_protocol_addr;   # haproxy 传递RealIP 443

 

remote_addr:如果中间没有代理,这个就是客户端的真实IP,如果有代理,这就是上层代理的IP.
X-Forwarded-For:一个HTTP扩展头,格式为 X-Forwarded-For: client, proxy1, proxy2 
X-Real-IP:自定义的HTTP头,用于把客户端真实IP一层层传递下去

Nginx

ssl

server {

  listen 13820; #监听端口

  server_name localhost;

  charset utf-8; #gbk,utf-8,gb2312,gb18030 可以实现多种编码识别

  ssl on; #开启ssl

  ssl_certificate /ls/app/nginx/conf/mgmtxiangqiankeys/server.crt; #服务的证书

  ssl_certificate_key /ls/app/nginx/conf/mgmtxiangqiankeys/server.key; #服务端key

  ssl_client_certificate /ls/app/nginx/conf/mgmtxiangqiankeys/ca.crt; #客户端证书

  ssl_session_timeout 5m; #session超时时间

  ssl_verify_client on; # 开户客户端证书验证

  ssl_protocols SSLv2 SSLv3 TLSv1; #允许SSL协议

  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #加密算法

  ssl_prefer_server_ciphers on; #启动加密算法

  access_log /lw/logs/nginx/dataadmin.test.com.ssl.access.log access ; #日志格式及日志存放路径

  error_log /lw/logs/nginx/dataadmin.test.com.ssl.error.log; #错误日志路径

}

 

 

 

 

 

 

Nginx

 

sql

 

if ( $query_string ~* ".*[\;'\<\>].*" ){
    return 444;
    }
if ($query_string  ~* ".*(insert|select|delete|update|count|\*|%|master|truncate|declare|\'|\;|and|or|\(|\)|exec).* ")
    {  
    return 444;
    }
if ($request_uri ~* "(cost\()|(concat\()") {
                 return 444;
    }
if ($request_uri ~* "[+|(%20)]union[+|(%20)]") {
                 return 444;
    }
if ($request_uri ~* "[+|(%20)]and[+|(%20)]") {
                 return 444;
    }
if ($request_uri ~* "[+|(%20)]select[+|(%20)]") {
                 return 444;
    }
set $block_file_injections 0;
if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") {
set $block_file_injections 1;
}
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") {
set $block_file_injections 1;
}
if ($block_file_injections = 1) {
return 448;
}
set $block_common_exploits 0;
if ($query_string ~ "(<|%3C).*script.*(>|%3E)") {
set $block_common_exploits 1;
}
if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
set $block_common_exploits 1;
}
if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
set $block_common_exploits 1;
}
if ($query_string ~ "proc/self/environ") {
set $block_common_exploits 1;
}
if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") {
set $block_common_exploits 1;
}
if ($query_string ~ "base64_(en|de)code\(.*\)") {
set $block_common_exploits 1;
}
if ($block_common_exploits = 1) {
return 444;
}
set $block_spam 0;
if ($query_string ~ "\b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)\b") {
set $block_spam 1;
}
if ($query_string ~ "\b(erections|hoodia|huronriveracres|impotence|levitra|libido)\b") {
set $block_spam 1;
}
if ($query_string ~ "\b(ambien|blue\spill|cialis|cocaine|ejaculation|erectile)\b") {
set $block_spam 1;
}
if ($query_string ~ "\b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)\b") {
set $block_spam 1;
}
if ($block_spam = 1) {
return 444;
}
set $block_user_agents 0;
if ($http_user_agent ~ "Wget") {
 set $block_user_agents 1;
}
# Disable Akeeba Remote Control 2.5 and earlier
if ($http_user_agent ~ "Indy Library") {
set $block_user_agents 1;
}
# Common bandwidth hoggers and hacking tools.
if ($http_user_agent ~ "libwww-perl") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "GetRight") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "GetWeb!") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "Go!Zilla") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "Download Demon") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "Go-Ahead-Got-It") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "TurnitinBot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "GrabNet") {
set $block_user_agents 1;
}
if ($block_user_agents = 1) {
return 444;
}

 

 

访问日志

access_log  /data1/logs/abc.com.log access;    #nginx访问日志

  }

 

 

 

}

 

 

 

 

 Nginx服务降权

(1) Nginx服务降权,用inca用户跑Nginx服务,给开发及运维设置普通账号,只要和inca同组即可管理Nginx,该方案解决了Nginx管理问题,防止root分配权限过大。 
(2) 开发人员使用普通账户即可管理Nginx服务以及站点下的程序和日志 
(3) 采取项目负责制,即谁负载项目维护处了问题就是谁负责。

实时Nginx降权方案

[root@web02 ~]# useradd inca

[root@web02 ~]# su - inca

[inca@web02 ~]$ pwd

/home/inca

[inca@web02 ~]$ mkdir conf logs www

[inca@web02 ~]$ cp /application/nginx/conf/mime.types ~/conf/

[inca@web02 ~]$ echo inca >www/index.html

 [inca@web01 ~]$ cat conf/nginx.conf

worker_processes  4;

worker_cpu_affinity 0001 0010 0100 1000;

worker_rlimit_nofile 65535;

error_log  /home/inca/logs/error.log;

user inca inca;

pid        /home/inca/logs/nginx.pid;

events {

    use epoll;

    worker_connections  10240;

}

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"';

 

    #web.fei fa daolian..............

    server {

        listen       8080;

        server_name  www.etiantian.org;

        root   /home/inca/www;

        location / {

            index  index.php index.html index.htm;

                }

         access_log  /home/inca/logs/web_blog_access.log  main;

           }

}

提示,需要关闭root权限的nginx,否则会报错

[root@web02 ~]# /application/nginx/sbin/nginx -s stop

[root@web02 ~]# lsof -i:80

切换用户,启动Nginx

[root@web02 ~]# su - inca

[inca@web02 ~]$  /application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf &>/dev/null &

[1] 3926

[inca@web02 ~]$ lsof -i:80

[1]+  Exit 1                  /application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf &>/dev/null

本解决方案的优点如下: 
1.Nginx服务降权,让网站更安全 
2.按用户设置站点权限,使站点更安全(无需虚拟化隔离) 
3.开发不需要用root即可完整管理服务及站点 
4.可实现对责任划分,网络问题属于运维的责任,打开不就是开发责任或共同承担

 

posted @ 2019-05-14 21:47  aspen-  阅读(411)  评论(0)    收藏  举报