gfdxy3322 发表于 2018-11-16 07:39:54

nginx站点的安全

  nginx:
  支持高并发连接.官方测试的是5w并发连接但在实际生产中可制成2-4w并发连接数,得益于nginx使用最新的epoll(linux 2.6内核)和kqueue(freebsd)网络I/O模型,而apache使用的则是传统的select模型,其比较稳定的prefork模式为多进程模式 ,需要经常派生子进程,所消耗的CPU等服务器资源要比nginx高的多.
  select 和epoll效率差的原因:
  select是轮询、epoll是触发式的,所以在特定的应用上效率相差会很多
  Select:
  1.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.
  2.操作限制:通过遍历FD_SETSIZE(1024)个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍.
  Poll:
  1.Socket数量几乎无限制:该模式下的Socket对应的fd列表由一个数组来保存,大小不限(默认4k).
  2.操作限制:同Select.
  Epoll:
  1.Socket数量无限制:同Poll
  2.操作无限制:基于内核提供的反射模式,有活跃Socket时,内核访问该Socket的callback,不需要遍历轮询. 但是当所有Socket都活跃的时候,这时候所有的callback都被唤醒, 会导致资源的竞争.既然都是要处理所有的Socket, 那么遍历是最简单最有效的实现方式.
  需要用到的安装包:
  nginx-1.4.4.tar.gz 可到官网http://nginx.org/en/download.html 下载
  libevent-2.0.21-stable.tar.gz http://pan.baidu.com/s/1kTfWZqf
  一、环境:
  1.编译环境
  "Development tools"
  "Additional Development"
  2.系统环境:
  nginx服务器: CentOS-6.4-x86_64192.168.80.10
  客户机:windows7,windows server 2003 192.168.80.1
  二、安装nginx:
  # tar -zxvf nginx-1.4.4.tar.gz -C /usr/local/src/
  解压安装包
  安装帮助可见官方网站: http://nginx.org/en/docs/configure.html
  # groupadd -r nginx
  # useradd -r -g nginx -s /sbin/nologin -Mnginx
  创建一个nginx组,创建一个系统账号nginx并加入nginx组中,-M表示不再创建其他目录
  需要使用pcre的库,所以要安装pcre-devel
  # yum --disablerepo=* --enablerepo=c6-media install pcre-devel
  然后需要安装libevent事件库:
  # tar -zxvf libevent-2.0.21-stable.tar.gz -C /usr/local/src/
  # cd /usr/local/src/libevent-2.0.21-stable/
  # ./configure --prefix=/usr/local/libevent 指明安装路径
  # make && make install
  在/etc/ld.so.conf.d/下建立一个libevent.conf文件,并写入一下内容,这是为了把libevent生成的库应用到系统中:
  # vim /etc/ld.so.conf.d/libevent.conf
  /usr/local/libevent/bin
  # ldconfig 刷新缓存
  接下来来到nginx的目录下,安装nginx:
  # cd /usr/local/src/nginx-1.4.4/
  # ./configure \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --with-http_ssl_module \
  --with-http_flv_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --with-pcre
  # make && make install
  来到nginx的安装目录:
  # cd /usr/local/nginx/sbin/
  使用-t来测试配置文件:
  # ./nginx -t
  发现测试结果如下:

  少了一个临时目录:
  # mkdir -pv /var/tmp/nginx/client
  创建完成后测试成功!
  # ./nginx运行nginx
  创建控制脚本:
  # cd /etc/init.d
  # vim nginx
  # chmod a+x nginx 给它执行权限
  脚本内容如下:
  #!/bin/bash
  prog=/usr/local/nginx/sbin/nginx
  lockfile=/var/lock/nginx.lock
  start () {
  if [ -e $lockfile ];then
  echo "the nginx server is started" && exit
  else
  echo -n "the nginx server is starting......"
  sleep 1
  $prog && echo ok && touch $lockfile || echo "fail"
  fi
  }
  stop () {
  if [ ! -e $lockfile ];then
  echo "the nginx server is stoped " && exit
  else
  echo -n "the nginx server is stopping...."
  $prog -s stop && echo ok && rm -rf $lockfile
  fi
  }
  configtest () {
  $prog -t
  }
  case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  restart)
  stop
  start
  ;;
  configtest)
  configtest
  ;;
  *)
  echo "USAGE:start|stop|restart"
  esac
  但是当执行stop命令的时候发现出错,
  # service nginx stop
  the nginx server is stopping....nginx: invalid PID number "" in "/var/run/nginx/nginx.pid"
  此时编辑/var/run/nginx/nginx.pid,在其中写入“01”,保存后退出,再次执行以上命令时没有出错。
  # vim /var/run/nginx/nginx.pid
  启动nginx了之后,在浏览器中输入http://192.168.80.10会看到如下界面:

  到这里nginx安装完毕!
  三、来做一些基本的测试:
  1.先来做一个关于基于ip地址虚拟主机的试验:
  在本机上添加一个ip地址:
  # ifconfig eth0:0 192.168.80.11
  然后在/usr/local/nginx/目录下创建tec文件夹,并添加一个静态网页index.html,写入内容"tec"
  # mkdir tec
  # echo "tec" >tec/index.htm
  来到客户机上修改C:\Windows\System32\drivers\etc下的hosts文件,添加如下内容
  192.168.80.10 www.tyedus.com
  192.168.80.11 tec.tyedus.com
  然后来编辑nginx的配置文件:
  # vim /etc/nginx/nginx.conf
  将配置文件中的第35行至47行拷贝一下,粘贴在第80行,然后分别作如下配置:


  完成后保存退出。
  重启nginx服务:
  (如果显示错误的话,可用pkill杀掉nginx进程,并手动删除/var/lock/nginx.lock后再启动nginx)
  然后在客户机上分别访问:http://www.tyedus.com:

  http://tec.tyedus.com:

  2.再来做一个关于基于端口虚拟主机的试验:
  先把另一个地址给关掉:
  # ifconfig eth0:0 down
  80端口和800端口分别对应不同的网页:
  192.168.2.101/usr/local/nginx/html   www.tyedus.com80
  192.168.2.101    /usr/local/nginx/tec    www.tyedus.com800
  然后来编辑nginx的配置文件:
  # vim /etc/nginx/nginx.conf
  编辑如下:
  然后重启nginx服务:
  # service nginx restart
  然后在客户机中分别访问:
  http://192.168.80.10 (默认是80端口)
  http://192.168.80.10:800 结果如下:
  接下来用nginx来做对apache站点的安全控制:
  http://wiki.nginx.org/Modules   这是官网上的对模块的帮助文档
  http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html   身份验证
  http://nginx.org/en/docs/http/ngx_http_access_module.html   访问控制
  3.然后来做一个基于主机头虚拟主机的试验,并实现身份认证:
  编辑nginx的配置文件:
  # vim /etc/nginx/nginx.conf
  编辑如下:

  来到客户机上修改C:\Windows\System32\drivers\etc下的hosts文件,添加如下内容
  192.168.80.10 www.tyedus.com
  192.168.80.10 tec.tyedus.com
  保存后退出,并重新启动nginx服务:
  要生成密钥文件需要一个httpd-tools工具,若系统中没有可以自行安装:
  # yum --disablerepo=* --enablerepo=c6-media install httpd-tools
  安装好之后,
  # htpasswd -c /usr/local/nginx/tec/.htpasswd user1
  创建.htpassword文件,并写入一个账号名为user1,然后输入密码。
  再次访问http://tec.tyedus.com,会出现如下界面,需要身份验证;

  4.使用CA证书技术来实现对nginx站点的安全控制:
  # cd /etc/pki/
  # vim tls/openssl.cnf

  如果有些文件/目录没有的话就自己创建一个:
  将match改为optional

  修改一些默认值,以免每次请求产生证书都要填写,当然也可以不该,在请求时自行填写:
  在这里还需要填写一些别的资料,(我这里都是随便填写的):

  编辑完成后保存退出:
  # touch index.txt
  # touch serial
  # echo "01" >serial
  # vim ../tls/openssl.cnf
  # openssl genrsa 1024 >private/cakey.pem
  在当前目录的private目录下用openssl产生一个用rsa加密算法加密的1024为的私钥,文件名称为cakey.pem(这个文件名称必须和openssl.conf里的文件名相同)
  # chmod 600 private/cakey.pem
  因为私钥是保密的,只能由管理员一个人可以访问所以改变它的权限
  # openssl req -new -key private/cakey.pem -x509 -out cacert.pem
  请求产生一个证书,证书上的公钥从私钥上提取,证书格式为-x509,名称为cacert.pem(这个文件名称必须和openssl.conf里的文件名称相同

  # mkdir -pv /etc/nginx/certs
  # cd /etc/nginx/certs/
  # openssl genrsa 1024 >nginx.key
  # chmod 600 nginx.key
  # openssl req -new -key nginx.key -out nginx.crq
  有了请求文件之后,可以基于请求文件来申请一份证书,产生的证书名称为nginx.crq

  # openssl ca -in nginx.crq -out nginx.cert

  图
  编辑nginx的配置文件:
  # vim /etc/nginx/nginx.conf
  编辑如下:

  保存后退出,重新启动nginx服务:
  # service nginx restart
  这里我用了一台windows server 2003作为客户机,ip地址为192.168.80.1
  修改C:\Windows\System32\drivers\etc下的hosts文件,添加一条“192.168.80.10 tec.tyedus.com”
  然后在浏览器中访问:https://tec.tyedus.com
  会发现证书不可信:
  回到服务器,把服务器的证书和CA的证书合在一起,拼成一个证书:
  # cp /etc/pki/CA/cacert.pem./
  把CA的证书拷至当前目录
  # mv nginx.cert nginx.cert.bak
  把服务器的证书重命名为nginx.cert.bak
  # cat nginx.cert.bak cacert.pem >nginx.cert
  把两个证书内容都写入到一个nginx.cert中,作为新的证书。
  # service nginx restart
  重启服务后再次访问,已经可以正常访问。

页: [1]
查看完整版本: nginx站点的安全