nginx 的限制连接模块limit_zone与limit_req_zone

nginx 上有两个限制连接的模块一个是 limit_zone 另一个是 limie_req_zone,两个都可以限制连接,但具体有什么不同呢?

下面是 nginx 官网上给的解释

limit_req_zone
Limit frequency of connections from a client. 
This module allows you to limit the number of requests for a given session, or as a special case, with one address.
Restriction done using leaky bucket. 

limit_zone
Limit simultaneous connections from a client. 
This module makes it possible to limit the number of simultaneous connections for the assigned session or as a special case, from one address. 

按照字面的理解,lit_req_zone的功能是通过 令牌桶原理来限制 用户的连接频率,(这个模块允许你去限制单个地址 指定会话或特殊需要 的请求数 )
而 limit_zone 功能是限制一个客户端的并发连接数。(这个模块可以限制单个地址 的指定会话 或者特殊情况的并发连接数)
一个是限制并发连接一个是限制连接频率,表面上似乎看不出来有什么区别,那就看看实际的效果吧~~~

在我的测试机上面加上这两个参数下面是我的部分配置文件

http{
limit_zone one  $binary_remote_addr  10m;
#limit_req_zone  $binary_remote_addr  zone=req_one:10m rate=1r/s;
server
{
 ......
limit_conn   one  1;
#limit_req   zone=req_one  burst=120;
......
}
    }

解释一下 limit_zone one $binary_remote_addr 10m;

这里的 one 是声明一个 limit_zone 的名字,$binary_remote_addr是替代 $remore_addr 的变量,10m 是会话状态储存的空间

limit_conn one 1 ,限制客户端并发连接数量为1

先测试 limit_zone 这个模块

我找一台机器 用ab 来测试一下 命令格式为

ab -c 100 -t 10 http://192.168.6.26/test.php

test.php 内容是phpinfo

看看日志里的访问

未分类

看来也不一定能限制的住1秒钟1个并发连接,(有网友跟我说这是因为测试的文件本身太小了才会这样,有时间一定测试一下),从日志里面可以看得出来 除了几个200以外其他的基本都是503,多数并发访问都被503了。

我又用ab多运行了一会儿,发现另一种情况

未分类

似乎随着数量的增多效果也会发生一些变化,并不是完全达到模块说明中的效果

看看当前的tcp连接数

# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 29
FIN_WAIT1 152
FIN_WAIT2 2
ESTABLISHED 26
SYN_RECV 16

这次测试下 limit_req_zone,配置文件稍微改动一下

http{
#limit_zone one  $binary_remote_addr  10m;
limit_req_zone  $binary_remote_addr  zone=req_one:10m rate=1r/s;
server
{
......
#limit_conn   one  1;
limit_req   zone=req_one  burst=120;
......
}
}

restart 一下 nginx

简单说明一下, rate=1r/s 的意思是每个地址每秒只能请求一次,也就是说根据令牌桶(经过网友冰冰的指正应该是漏桶原理)原理 burst=120 一共有120块令牌,并且每秒钟只新增1块令牌,
120块令牌发完后 多出来的那些请求就会返回503
测试一下

ab -c 100 -t 10 http://192.168.6.26/test.php

看看这时候的访问日志

未分类

确实是每秒请求一次,那多测试一会儿呢?把时间从10秒增加到30秒

未分类

这个时候应该是120 已经不够用了,出现很多503,还有两种情况会出现,请看图

未分类

这种情况很像是 在队列里的一些请求得不到响应而超时了,但我不确定是不是这种情况。

未分类

客户端自己等不及断开了,返回499

看看当前的tcp连接数

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, 
S[a]}'
TIME_WAIT 51
FIN_WAIT1 5
ESTABLISHED 155
SYN_RECV 12

虽然这样会让nginx 一秒钟只处理一个请求,但是仍然会有很多还在队列里面等待处理,这样也会占用很多tcp连接,从上面那条命令的结果中就能看得出来。

如果这样呢

limit_req   zone=req_one  burst=120 nodelay;

加上 nodelay之后超过 burst大小的请求就会直接 返回503,如图

未分类

也是每秒处理1个请求,但多出来的请求没有象刚才那样等待处理,而是直接返回503。

当前的tcp连接

# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 30
FIN_WAIT1 15
SYN_SENT 7
FIN_WAIT2 1
ESTABLISHED 40
SYN_RECV 37

已连接的数量比上面的少了一些
通过这次测试我发现 这两种模块都不能做到绝对的限制,但的确已经起到了很大的减少并发和限制连接的作用,在生产环境中具体用哪种或者需要两种在一起使用就要看各自的需求了。

web网站性能优化:nginx开启GZIP压缩网页,JS,CSS

提高web网站性能优化,nginx开启GZIP压缩网页,JS,CSS,从而可以节约大量的带宽,提高传输效率,但是会消耗cpu资源,自己可以权衡一下,总体来说开启是值得的。

在nginx的nginx.conf的 http { } 里添加如下配置

nginx开启的配置:

gzipon;  #开启gzip
gzip_min_length 1024;  #低于1kb的资源不压缩,
gzip_comp_level 3; #压缩级别【1-9】,越大压缩率越高,同时消耗cpu资源也越多,建议设置在4左右。
gzip_types text/plainapplication/javascriptapplication/x-javascripttext/javascripttext/xmltext/css;  #需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片,下面会讲为什么。
gzip_disable "MSIE [1-6].";  #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_vary on;  #是否添加“Vary: Accept-Encoding”响应头

保存并重启nginx,刷新页面(为了避免缓存,请强制刷新)预览器上就能看到效果了。

火狐预览器:

未分类

谷歌预览器:

未分类

再去站长之家检查Seo:

未分类

可以看到压缩率100%,可怕,震惊!

注意几点:

(1)在gzip_http_version的默认值是1.1,就是说对HTTP/1.1协议的请求才会进行gzip压缩。
如果使用了proxy_pass进行反向代理,那么nginx和后端的upstream server之间是用HTTP/1.0协议通信的。
如果使用nginx通过反向代理做Cache Server,前端的nginx没有开启gzip,且后端的nginx上未设置gzip_http_version为1.0,那么Cache的url将不会被gzip压缩。

(2)gzip_min_length :从上图可以看到最后一个js大小不到1K所以是不压缩的,倒数第二个js来源第三方所以也不进行压缩。
设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。 即: gzip_min_length 1024。

(3)gzip虽然好用,但是一下类型的资源不建议启用。图片类型,因为图片如jpg、png本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。

大文件,因为会消耗大量的cpu资源,且不一定有明显的效果。

在 docker 容器里使用 nginx-proxy 实现自动反向代理及负载均衡

一、Docker 简介

Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。Docker利用Linux核心中的资源分脱机制,例如cgroups,以及Linux核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担.

1.1 docker 安装

Windows

Docker Windows 客户端需要开启 Hyper-V,安装过程会自动提示打开与否。

  • 从官网下载安装包双击安装。 https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe
  • 双击图标运行docker,初次打开可能需要几分钟时间。当右下角出现 docker 标志说明已经开始运行了!

未分类

  • 打开终端开始 docker 之旅

W
indows 下推荐使用 Docker for Windows 客户端,不要使用 docker toolbox。当从官方仓库拖取镜像时速度比较感人,建议使用国内镜像加速。

CentOS

1、安装依赖包

sudo yum install -y yum-utils 
  device-mapper-persistent-data 
  lvm2

2、用下面的命令设置 稳定版的 源地址

sudo yum-config-manager 
    --add-repo 
    https://download.docker.com/linux/centos/docker-ce.repo

3、安装 docker-ce

sudo yum install docker-ce

4、开始使用

sudo systemctl start docker
sudo docker run hello-world

Debian

系统需求:

  • 64 bit
  • Stretch (稳定版)
  • Jessie 8.0 (LTS)
  • Wheezy 7.7 (LTS)
  • Linux 内核大于 3.10

1、若安装有旧版本则先卸载

sudo apt-get remove docker docker-engine docker.io

2、安装依赖

sudo apt-get update
  • Jessie 或 Stretch 版:
sudo apt-get install 
    apt-transport-https 
    ca-certificates 
    curl 
    gnupg2 
    software-properties-common
  • Wheezy 版:
sudo apt-get install 
    apt-transport-https 
    ca-certificates 
    curl 
    python-software-properties

3、添加 Docker 官方 GPG key

curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -

设置 源地址

sudo add-apt-repository 
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") 
   $(lsb_release -cs) 
   stable"

4、安装 Docker-ce

sudo apt-get update
sudo apt-get install docker-ce

enjoy it:

sudo docker run hello-world

Debian 系统使用 apt-get 默认安装版本比较旧,使用 docker-compose 管理 Docker容器时会报错客户端和服务器版本不一致。建议按以上官方安装说明安装新版 Docker。

二、Nginx 介绍

Nginx 是一个 web 服务器。它类似于 Lighttpd,作为轻量级的 web server,可以替代重量级的 Apache/IIS。Nginx 专为性能优化而开发,是一个快速且能经受高负载考验的 web server。详情见 wiki 页面:

2.1 下载 Nginx 官方镜像

docker pull nginx

默认标签为最新版,若需要其它版本指定标签即可 请从docker hub获取帮助

三、nginx-proxy 介绍

nginx-proxy 启动一个容器来运行 nginx 和 docker-gen。 在主机上的容器启动和停止时 docker-gen 会生成 nginx 反向代理配置并且重新加载 nginx。

| Automated Nginx reverse proxy for docker containers

3.1 下载镜像

docker pull jwilder/nginx-proxy

如何使用

  • 启动 nginx-proxy 容器:
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
  • 再启动一个需要被代理的容器,使用环境变量
    VIRTUAL_HOST=domain.com
docker run -e VIRTUAL_HOST=domain.com nginx

被代理的容器必须 expose 被代理的端口,可以通过在 Dockerfile 里面使用 EXPOSE 指令或者在 docker run 时使用 –expose 参数。

在 DNS 上设置转发 foo.bar.com 到 nginx-proxy 的主机上,之后请求就会被自动路由到设置了相同 VIRTUAL_HOST 环境变量的容器上。

四、使用 Letsencrypt 证书加密

letsencrypt-nginx-proxy-companion 是一个轻量级的代理容器,配合 nginx-proxy实现自动创建和自动更新 Let’s Encrypt 证书。

4.1 下载镜像

docker pull jrcs/letsencrypt-nginx-proxy-companion

4.2 用法

要将其与原始 nginx 代理容器一起使用,您必须从 nginx-proxy 容器声明3个可写卷:

  • /etc/nginx/certs 创建和更新 Let’s Encrypt 证书
  • /etc/nginx/vhost.d 更改虚拟主机配置 (Let’s Encrypt)
  • /usr/share/nginx/html 写入验证文件 (Let’s Encrypt)

启动 nginx-proxy

docker run -d -p 80:80 -p 443:443 
  --name nginx-proxy 
  -v /path/to/certs:/etc/nginx/certs:ro 
  -v /etc/nginx/vhost.d 
  -v /usr/share/nginx/html 
  -v /var/run/docker.sock:/tmp/docker.sock:ro 
  --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy 
  jwilder/nginx-proxy

–label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy 是必需的,否则 Let’s Encrypt 不知道使用哪个容器。

启动 LetsEncrypt

docker run -d 
  -v /path/to/certs:/etc/nginx/certs:rw 
  -v /var/run/docker.sock:/var/run/docker.sock:ro 
  --volumes-from nginx-proxy 
  jrcs/letsencrypt-nginx-proxy-companion

再启动需要被代理和加密的容器,加上环境变量 VIRTUAL_HOST=domain.com 。
docker run -e “VIRTUAL_HOST=foo.bar.com” …
要使其能自动创建和更新证书需设置环境变量 LETSENCRYPT_HOST LETSENCRYPT_EMAIL 即可。

4.3 Docker-compose

Compose 是定义和运行多容器Docker应用程序的工具。 使用Compose,您可以使用YAML文件来配置应用程序的服务。 然后,使用单个命令创建并启动配置中的所有服务。 要详细了解Compose的所有功能,请参阅功能列表。

Linux 安装

使用以下命令

sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

赋可执行权限

sudo chmod +x /usr/local/bin/docker-compose

Windows 安装

以管理员身份运行 PowerShell

Invoke-WebRequest "https://github.com/docker/compose/releases/download/$dockerComposeVersion/docker-compose-Windows-x86_64.exe" -UseBasicParsing -OutFile $Env:ProgramFilesdockerdocker-compose.exe

使用 Compose

首先 创建一个 docker-compose.yml 的文件,在当前目录运行 docker-compose up 。

五、完整 docker-compose 文件

version: '3'
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    labels: 
        com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    ports: 
      - 80:80
      - 443:443
    volumes:
      - /docker/nginx/certs:/etc/nginx/certs:ro
      - /docker/nginx/conf.d:/etc/nginx/conf.d
      - /docker/nginx/vhost.d:/etc/nginx/vhost.d
      - /docker/nginx/html/:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    volumes:
      - /docker/nginx/conf.d:/etc/nginx/conf.d
      - /docker/nginx/vhost.d:/etc/nginx/vhost.d
      - /docker/nginx/html/:/usr/share/nginx/html
      - /docker/nginx/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
  someweb:  
    image: nginx
    container_name: someweb
    environment:
      - VIRTUAL_HOST=somedomain.com
      - LETSENCRYPT_HOST=somedomain.com
      - [email protected]
networks:
  default:
    external:
      name: web-proxy

Nginx自建CDN与ngx_cache_purge清除缓存

Nginx自建CDN在 https://www.xiaoz.me/archives/8775 已经介绍过,有兴趣的童鞋可参考,不过可以在这篇文章基础上继续完善,比如添加ngx_cache_purge模块来清除缓存。

未分类

编译ngx_cache_purge模块

清理Nginx缓存需要ngx_cache_purge模块帮助,可输入命令nginx -V查看已经编译的模块,如果没有ngx_cache_purge说明模块没有安装,则需要重新编译一下Nginx

未分类

模块下载地址为 http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz ,如何编译Nginx可参考: https://www.xiaoz.me/archives/7126

配置ngx_cache_purge

在server段内加入下面的配置,并重载Nginx,在这里xiaoz被坑了很久,下面的cache_one请与keys_zone定义的值保持一致,否则nginx将无法启动。

location ~ /purge(/.*) {
allow all;
proxy_cache_purge cache_one $proxy_host$1$is_args$args;
error_page 405 =200 /purge$1;
}

如果想清理缓存,添加purge参数即可,如https://www.xiaoz.me/purge/xxx.png,如果该文件存在缓存,则会提示如下截图。若不存在缓存,则返回404,若无论什么情况均返回404,可能配置没成功。

未分类

WordPress自动刷新缓存

小z博客使用的Wordpress程序,如果启用CDN后页面被缓存,用户提交评论后无法马上显示出来,可以使用Ajax异步请求ngx_cache_purge接口,当用户提交评论的时候则清除该页面缓存。只需要下面的这段js添加到footer.php即可。

<script>
        $(document).ready(function(){
            $("#submit").click(function(){
                var uri = "https://www.xiaoz.me/purge" + window.location.pathname;
                $.get(uri,function(data,status){
                    return true;
                });
            });
        });
    </script>

代码中的https://www.xiaoz.me请改成您自己的域名,以下是小z博客CDN完整配置,仅供参考:

proxy_cache_path /data/caches levels=1:2 keys_zone=xiaozcdn:100m inactive=30m max_size=100m;
server
    {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl on;
    ssl_certificate /xxx/www_xiaoz_me.crt;
    ssl_certificate_key /xxx/www_xiaoz_me.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;

    server_name     www.xiaoz.me;
    charset utf-8,gbk;

    #删除缓存
    location ~ /dcache(/.*) {
    allow all;
    proxy_cache_purge xiaozcdn $proxy_host$1$is_args$args;
    error_page 405 =200 /purge$1;
    }

       location / {
       #proxy_set_header Accept-Encoding "";
       proxy_pass https://www.xiaoz.me;
       proxy_redirect off;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_cache xiaozcdn;
       proxy_cache_valid  200 304  30m;
       proxy_cache_valid  301 24h;
       proxy_cache_valid  500 502 503 504 0s;
       proxy_cache_valid any 1s;
       #达到第几次被缓存?
       proxy_cache_min_uses 1;
       expires 12h;
       proxy_cache_key    $uri$is_args$args;
    }
}
server
{
    listen 80;
    server_name www.xiaoz.me;
    rewrite ^(.*) https://www.xiaoz.me$1 permanent;
}

总结

Nginx应用十分广泛,功能也非常强大,但是参数繁多,xiaoz所了解的不过九牛一毛。上述方案已经应用到小z博客中,具体效果有待观察和改进,若有问题请反馈。

Nginx purge_cache出现404的问题

最近给自建CDN添加了purge_cache模块,用于清除CDN缓存,添加后出现404,网上搜了一大堆都不符合我的情况,最终用Google搜索英文关键词解决。

解决办法

我原本的配置是这样的,看起来似乎并无问题,但是访问http://www.xiaoz.me/purge/1.jpg出现404

location ~ /purge(/.*) {
allow all;
proxy_cache_purge cache_one $host$1$is_args$args;
error_page 405 =200 /purge$1;
}

最终发现是一个参数的原因,由于我是Nginx反向代理自建CDN,$host参数需要修改为$proxy_host,修改后的配置如下,最终得以解决。

location ~ /purge(/.*) {
allow all;
proxy_cache_purge cache_one $proxy_host$1$is_args$args;
error_page 405 =200 /purge$1;
}

修改php-fpm和nginx运行用户

(php)项目a是用test用户运行
nginx和php-fpm是www-data用户运行
(python)项目b是用test用户运行

项目a通过php函数exec调用python脚本的接口造成了没有权限访问目录

直接把项目b的权限切换为www-data可以执行,但是不便于开发,最好是把php、nginx、项目a、项目b都在一个用户、组下面。

打个比方test是当前登录用户
修改nginx的运行角色

cd /etc/nginx
sudo vi nginx.conf
# 头部是这样
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

# 修改为
user test;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

# 重启nginx
sudo service nginx restart

修改php的运行角色

cd /etc/php/7.0/fpm/pool.d/
sudo vi www.conf
# 找到
user = www-data
group = www-data

# 改为
user = test
group = test

cd /run/php/
ls -al
# 这个目录下面有两个文件
# php7.0-fpm.pid和php7.0-fpm.sock
# 修改这两个文件的权限
sudo chown test:test php7.0-fpm.pid
sudo chown test:test php7.0-fpm.sock

# 重启php-fpm
sudo service php7-fpm restart

test用户是杜撰出来的根据自己的当前用户修改。

Nginx SSL安全性增强,HTTPS网站轻松快速获得A+评级

从 HTTP 到 HTTPS 只需要一个SSL证书,而在安装 SSL 证书后,如何在 Qualys SSL Labs 网站获得更高的安全评级呢?该如何增强 SSL 安全性呢?

未分类

子凡下面就通过对 Nginx 服务器设置的 SSL 安全机制与大家做个简单的分享,还记得之前子凡分享过 HSTS 安全协议配置,可以简单从 HTTP 到 HTTPS 的安全高效转移,而今天给大家说的有共同之处,也更为全面。

未分类

通过禁用 SSL 压缩来降低 CRIME 攻击威胁;禁用协议上存在安全缺陷的 SSLv3 及更低版本,并设置更健壮的加密套件cipher suite来尽可能启用前向安全性Forward Secrecy;此外还启用了 HSTS 和 HPKP。这样我们就拥有了一个健壮而可经受考验的 SSL 配置,并可以在 Qually Labs 的 SSL 测试中得到 A 级及以上评分。

#Nginx SSL安全性增强
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

以上便是子凡目前在用的一个简单配置,通过在原有的服务器配置文件中添加以上信息就瞬间从之前的A-评价获得了A+,实现了 Nginx 服务器的 SSL 安全性增强配置。

同样我们还可以通过 https://cipherli.st 找到 Apache 和 Lighttpd 的安全设置,同样也有 Nginx 的安全设置,只是可能与以上子凡提供的有所区别,将其复制粘帖到服务器相关的配置文件中保存即可。

最后配置好后,我们便可通过 https://www.ssllabs.com/ssltest 进行评级测试。

nginx访问日志GET后面用http://开头

今天检查nginx访问日志的时候发现奇怪的日志

[02/Nov/2017:13:35:46 +0800] "GET http://www.baidu.com/ HTTP/1.1" 200 8672 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0" -

截图如下

未分类

这里取的只是百度的域名,还有好多其他的域名,这个应该是代理攻击

有没有发现GET后面用http://开头的,正常情况GET后面是用”/”开头,如下面的访问日志

[08/Nov/2017:21:54:15 +0800] "GET /2330.html HTTP/1.1" 200 8419 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" -

这个问题在百度gogole的相关文章比较少,所以现在不清楚目前的处理方法是否正确,如果你要遇到了这个问题,可以尝试一下

目前处理的方法

#nginx中添加下面的配置,主要作用就是没有指定域名的返回444

server {
    server_name _;
    location / { 
        return 444; 
    }
}
server
{

    listen 443 ssl http2;
    server_name www.phpsong.com;
    //...


    #添加代码,主要作用如果域名不是www.phpsong.com的就返回444
    if ($host !~ ^(phpsong.com|www.phpsong.com)$) {
              return 444;
    }

    //...
}

设置之后,发现这种日志不存在了,因为不清楚模拟这种攻击,所以不清楚是否已经解决了,apache的解决方法可以看一下这个文章https://wiki.apache.org/httpd/ProxyAbuse

如何在nginx下实现访问web网站密码认证保护的功能

在某些特定的环境下,我们希望nginx下的web站点在访问时需要用户输入账户密码才能访问。以便拒绝那些不速之客。

其实,配置起来也很简单,按照下面的步骤即可实现。

一、编辑虚拟主机配置文件。

server { 
     listen       80;  //监听端口为80 
     server_name  www.abc.com;  //虚拟主机网址 
     location / { 
            root   sites/www1;  //虚拟主机网站根目录 
            index  index.html index.htm;  //虚拟主机首页 
            auth_basic "secret";  //虚拟主机认证命名 
            auth_basic_user_file /usr/local/nginx/passwd.db; //虚拟主机用户名密码认证数据库 
      } 
      #省略其他配置
      ....
}

二、通过htpasswd命令生成用户名及对应密码数据库文件。

[root@localhost /]#mkdir /usr/local/nginx
[root@localhost /]#vi /usr/local/nginx/passwd.db
[root@localhost /]# htpasswd -c /usr/local/nginx/passwd.db admin  //创建认证信息,admin 为认证用户名 
New password: *******  //输入认证密码 
Re-type new password: ********  //再次输入认证密码 
Adding password for user admin 
[root@localhost /]# chmod 400 /usr/local/nginx/passwd.db      //修改网站认证数据库权限 
[root@localhost /]# chown nginx.  /usr/local/nginx/passwd.db  //修改网站认证数据库属主和属组
[root@localhost /]# cat /usr/local/nginx/passwd.db            //可以看到通过htpasswd生成的密码为加密格式
admin:x/J1o94NgIV2k

三、重新启动nginx即可生效。

service nginx reload

通过上面的三个步骤即可完成在nginx下实现访问web网站密码认证保护的功能。

nginx显示文件目录列表并提供文件下载服务

测试环境:

centos 7 64 位

安装并启动nginx

# yum -y install wget vim
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# yum clean all
# yum -y install nginx
# iptables -F
# service nginx start

更改nginx配置文件

# cd /etc/nginx/
# cp nginx.conf nginx.conf.bk
# vim nginx.conf   <--找到server字段下的location,更改如下
.......
.......
server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
charset utf-8;
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){
            add_header Content-Disposition attachment;
            }
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
.......
....... 

新建一些测试文件和文件夹

# cd /usr/share/nginx/html/
# rm -fr *
# touch A{1..9}.txt
# mkdir docs
# mkdir pdf
# chown nginx.nginx /usr/share/nginx/html/ -R
# service nginx reload

浏览器验证访问,如图

未分类