Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

nginx的模块需要第三方库的支持,检查是否安装下列库:zlib、zlib-devel(nginx扩展,gzip压缩)、openssl、openssl-devel(nginx扩展)、prce、prce-devel(重写rewrite、支持nginx伪静态);Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个。

1、安装编译环境

[root@localhost ~]# yum -y install gcc gcc-c++ automake autoconf libtool make

2、安装PCRE库

[root@localhost src]# cd /usr/local/src/
[root@localhost src]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz
[root@localhost src]# tar zxvf pcre-8.36.tar.gz
[root@localhost pcre-8.36]#  cd pcre-8.36
[root@localhost pcre-8.36]# ./configure --prefix=/usr/local/pcre
[root@localhost pcre-8.36]# make
[root@localhost pcre-8.36]# make install

3、安装zlib库

[root@localhost pcre-8.36]# cd /usr/local/src/
[root@localhost src]# wget http://zlib.net/zlib-1.2.8.tar.gz
[root@localhost src]# tar zxvf zlib-1.2.8.tar.gz
[root@localhost src]# cd zlib-1.2.8
[root@localhost zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@localhost zlib-1.2.8]# make 
[root@localhost zlib-1.2.8]# make install

4、安装ssl

[root@localhost zlib-1.2.8]# cd /usr/local/src/
[root@localhost src]# wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
[root@localhost src]# tar zxvf openssl-1.0.1j.tar.gz
[root@localhost src]# cd openssl-1.0.1j
[root@localhost openssl-1.0.1j]# ./config --prefix=/usr/local/openssl
[root@localhost openssl-1.0.1j]# make
[root@localhost openssl-1.0.1j]# make install
[root@localhost openssl-1.0.1j]# vim /etc/profile
export PATH=$PATH:/usr/local/openssl/bin
[root@localhost openssl-1.0.1j]# source /etc/profile

5、安装nginx

[root@localhost openssl-1.0.1j]# cd ..
[root@localhost src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
[root@localhost src]# tar zxvf nginx-1.6.2.tar.gz
[root@localhost src]# cd nginx-1.6.2
[root@localhost nginx-1.6.2]# groupadd www
[root@localhost nginx-1.6.2]# useradd -g www www -s /sbin/nologin
[root@localhost nginx-1.6.2]# ./configure --prefix=/usr/local/nginx --without-http_memcached_module --user=www --group=wwww --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-openssl=/usr/local/src/openssl-1.0.1j --with-zlib=/usr/local/src/zlib-1.2.8 --with-pcre=/usr/local/src/pcre-8.36
[root@localhost nginx-1.6.2]# make
[root@localhost nginx-1.6.2]# make install

--with-openssl=/usr/local/src/openssl-1.0.1j --with-zlib=/usr/local/src/zlib-1.2.8 --with-pcre=/usr/local/src/pcre-8.36指向的是源码包解压的路径,而不是安装的路径,否则会报错

 检查是否安装成功  

[root@localhost nginx-1.6.2]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: [emerg] getgrnam("wwww") failed
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
[root@localhost sbin]#

编译时候指定组成wwww,重新修改下即可

[root@localhost nginx]# usermod -g wwww www
[root@localhost nginx]# id www
uid=500(www) gid=501(wwww) groups=501(wwww)
[root@localhost nginx]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx -t -c /usr/local/nginx/conf/nginx.conf
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost sbin]#

参数"-c"指定了配置文件的路径,如果不加'-c"参数, nginx,会默认加载其安装目录中conf子目录中的nginx.conf文件。

-t:测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误

查看nginx版本:

-v:显示 nginx 版本号。

-V:显示 nginx 的版本号以及编译环境信息以及编译时的参数。

[root@localhost sbin]# ./nginx -V
nginx version: nginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-openssl=/usr/local/src/openssl-1.0.1j --with-zlib=/usr/local/src/zlib-1.2.8 --with-pcre=/usr/local/src/pcre-8.36
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.6.2
[root@localhost sbin]#

启动nginx 

[root@localhost sbin]# ./nginx 
[root@localhost sbin]# /usr/local/nginx/sbin/nginx 
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
[root@localhost sbin]# lsof -i :80
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
clock-app  7093 root   21u  IPv4  53701      0t0  TCP 10.15.24.112:52763->63.238.2.211:http (ESTABLISHED)
nginx     10145 root    6u  IPv4  53797      0t0  TCP *:http (LISTEN)
nginx     10146  www    6u  IPv4  53797      0t0  TCP *:http (LISTEN)
[root@localhost sbin]# kill -9 7093
[root@localhost sbin]# kill -9 10145
[root@localhost sbin]# kill -9  10146
[root@localhost sbin]# /usr/local/nginx/sbin/nginx 
[root@localhost sbin]# netstat -ano|grep -i ":80"
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      off (0.00/0/0)
[root@localhost sbin]# ps -ef|grep "nginx"
root     10167     1  0 05:17 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
www      10168 10167  0 05:17 ?        00:00:00 nginx: worker process      
root     10174  1882  0 05:18 pts/0    00:00:00 grep nginx
[root@localhost sbin]#

执行/usr/local/nginx/sbin/nginx时提示端口被占用,因为前面我已经启动过了./nginx导致端口被占用,

重启nginx

[root@localhost sbin]# /usr/local/nginx/sbin/nginx -s reload
或者
[root@localhost sbin]# kill -HUP `cat /usr/local/nginx/logs/nginx.pid `

打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。RHEL6编译安装nginx、开机启动脚本、重新编译、安装配置naxsi waf防火墙_第1张图片

更改默认站点位置:

默认站点在/usr/local/nginx/html/,现在更换到/var/www/html中

[root@localhost conf]# vim nginx.conf
 43         location / {
 44 #            root   html;
 45              root   /var/www/html;
 46             index  index.html index.htm;
 47         }
 [root@localhost conf]# cd /var/www/html/
[root@localhost html]# vim index.html 

Hello Justin!
[root@localhost conf]# service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
[root@localhost conf]#

RHEL6编译安装nginx、开机启动脚本、重新编译、安装配置naxsi waf防火墙_第2张图片

如果按照上面在location / {部分修改了root目录后还不能访问,类似报File not found错误大部分应该是/etc/nginx/conf.d/default.conf里面的php解析部分配置不对,解决的话就是把root定义,在server下加上,这样root的作用域就扩大了。把location ~ \.php${里面的root删除。fastcgi_param部分改为$document_root$fastcgi_script_name;(本次环境nginx是通过yum安装的)

[root@Zabbix zabbix]# vim /etc/nginx/conf.d/default.conf
  5     listen       80;
  6     root   /usr/share/nginx/html/zabbix;    #添加此行
  7     server_name  _;
   13     location / {
 14         root   /usr/share/nginx/html/zabbix;   #添加此行
 15         #root   /usr/share/nginx/html;
 16         index  index.php index.html index.htm;
 17         # example
  42     location ~ \.php$ {
 43         #root           html;             #注释此行
 44         fastcgi_pass   127.0.0.1:9000;
 45         fastcgi_index  index.php;
 46         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  #修改此行
 47         include        fastcgi_params;
 48     }
 [root@Zabbix zabbix]# service nginx restart


更改默认端口:

[root@ProxyServer conf]# vim /opt/nginx/conf/nginx.conf 
 35     server {
 36         listen       80;     ;修改为需要的端口号
 37         server_name  localhost;
 38 
 39         #charset koi8-r;
 40 
 41         #access_log  logs/host.access.log  main;
 42 
 43         location / {
 44             root   html;
 45             index  index.html index.htm;
 46         }

禁止空主机头访问:

即直接输入IP地址后无法访问,设置返回404

[root@ProxyServer conf]# cp nginx.conf nginx.conf20151106

找到server,在上面一行添加如下内容:

 34     server {
 35     listen 80 default;
 36     server_name _;
 37    location / {
 38    root html;
 39    return 404;
 40    }
 41    location ~ /.ht {
 42    deny all;
 43    }
 44    }             
 #添加如上内容:            
 45     server {
 46         listen       80;

或者重定向到其他地方,如www.sina.com.cn

在文末添加以下内容

server {
server_name 192.168.100.198 ;   
rewrite ^(.*) http://www.sina.com$1 permanent;
}
}

切换到普通用户nginx下时候无法启动报:Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

以为是端口被占用,通过netstar发现80端口并未被占用,切换到root下面发现可以启动,查找资料:在Linux中1024以下的端口号都需要root权限才能使用,所以普通用户启动程序绑定会报出权限问题。于是我把80修改成了8089,结果可以正常启动

设置nginx开机启动

通过脚本来实现

[root@localhost ~]# vim /etc/rc.d/init.d/nginx
[root@localhost ~]# cat /etc/rc.d/init.d/nginx 
#!/bin/sh

#

# nginx - this script starts and stops the nginx daemon

#

# chkconfig: - 85 15

# description: Nginx is an HTTP(S) server, HTTP(S) reverse \

# proxy and IMAP/POP3 proxy server

# processname: nginx

# config: /etc/nginx/nginx.conf

# config: /usr/local/nginx/conf/nginx.conf

# pidfile: /usr/local/nginx/logs/nginx.pid

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"

prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {

# make required directories

user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`

if [ -z "`grep $user /etc/passwd`" ]; then

useradd -M -s /bin/nologin $user

fi

options=`$nginx -V 2>&1 | grep 'configure arguments:'`

for opt in $options; do

if [ `echo $opt | grep '.*-temp-path'` ]; then

value=`echo $opt | cut -d "=" -f 2`

if [ ! -d "$value" ]; then

# echo "creating" $value

mkdir -p $value && chown -R $user $value

fi

fi

done

}

start() {

[ -x $nginx ] || exit 5

[ -f $NGINX_CONF_FILE ] || exit 6

make_dirs

echo -n $"Starting $prog: "

daemon $nginx -c $NGINX_CONF_FILE

retval=$?

echo

[ $retval -eq 0 ] && touch $lockfile

return $retval

}

stop() {

echo -n $"Stopping $prog: "

killproc $prog -QUIT

retval=$?

echo

[ $retval -eq 0 ] && rm -f $lockfile

return $retval

}

restart() {

#configtest || return $?

stop

sleep 1

start

}

reload() {

#configtest || return $?

echo -n $"Reloading $prog: "

killproc $nginx -HUP

RETVAL=$?

echo

}

force_reload() {

restart

}

configtest() {

$nginx -t -c $NGINX_CONF_FILE

}

rh_status() {

status $prog

}

rh_status_q() {

rh_status >/dev/null 2>&1

}

case "$1" in

start)

rh_status_q && exit 0

$1

;;

stop)

rh_status_q || exit 0

$1

;;

restart|configtest)

$1

;;

reload)

rh_status_q || exit 7

$1

;;

force-reload)

force_reload

;;

status)

rh_status

;;

condrestart|try-restart)

rh_status_q || exit 0

;;

*)

echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

exit 2

esac
[root@localhost ~]# chmod 755 /etc/rc.d/init.d/nginx 
[root@localhost ~]# chkconfig nginx on
[root@localhost ~]# service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
[root@localhost ~]#


至此nginx安装完成,默认站点在/usr/local/nginx/html/

[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html  index.html
[root@localhost html]#

改此目录位置到/var/www/html

[root@localhost html]# mkdir -p /var/www/html
[root@localhost html]# cat /var/www/html/index.html 
Justin peng!!!
[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
 43         location / {
 44 #           root   html;
 45             root   /var/www/html;
 46             index  index.html index.htm;
 47         }
 [root@localhost html]# service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
[root@localhost html]#

RHEL6编译安装nginx、开机启动脚本、重新编译、安装配置naxsi waf防火墙_第3张图片

nginx 编译参数

--prefix= 指向安装目录

--sbin-path 指向(执行)程序文件(nginx)

--conf-path= 指向配置文件(nginx.conf)

--error-log-path= 指向错误日志目录

--pid-path= 指向pid文件(nginx.pid)

--lock-path= 指向lock文件(nginx.lock)(安装文件锁定,防止安装文件被别人利用,或自己误操作。)

--user= 指定程序运行时的非特权用户

--group= 指定程序运行时的非特权用户组

--builddir= 指向编译目录

--with-rtsig_module 启用rtsig模块支持(实时信号)

--with-select_module 启用select模块支持(一种轮询模式,不推荐在高载环境下使用)禁用:--without-select_module

--with-poll_module 启用poll模块支持(功能与select相同,与select特性相同,为一种轮询模式,不推荐在高载环境下使用)

--with-file-aio 启用file aio支持(一种APL文件传输格式)

--with-ipv6 启用ipv6支持

--with-http_ssl_module 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)

--with-http_realip_module 启用ngx_http_realip_module支持(这个模块允许从请求标头更改客户端的IP地址值,默认为关)

--with-http_addition_module 启用ngx_http_addition_module支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)

--with-http_xslt_module 启用ngx_http_xslt_module支持(过滤转换XML请求)

--with-http_image_filter_module 启用ngx_http_image_filter_module支持(传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)

--with-http_geoip_module 启用ngx_http_geoip_module支持(该模块创建基于与MaxMind GeoIP二进制文件相配的客户端IP地址的ngx_http_geoip_module变量)

--with-http_sub_module 启用ngx_http_sub_module支持(允许用一些其他文本替换nginx响应中的一些文本)

--with-http_dav_module 启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭,需编译开启

--with-http_flv_module 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件)

--with-http_gzip_static_module 启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)

--with-http_random_index_module 启用ngx_http_random_index_module支持(从目录中随机挑选一个目录索引)

--with-http_secure_link_module 启用ngx_http_secure_link_module支持(计算和检查要求所需的安全链接网址)

--with-http_degradation_module  启用ngx_http_degradation_module支持(允许在内存不足的情况下返回204或444码)

--with-http_stub_status_module 启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)

--without-http_charset_module 禁用ngx_http_charset_module支持(重新编码web页面,但只能是一个方向--服务器端到客户端,并且只有一个字节的编码可以被重新编码)

--without-http_gzip_module 禁用ngx_http_gzip_module支持(该模块同-with-http_gzip_static_module功能一样)

--without-http_ssi_module 禁用ngx_http_ssi_module支持(该模块提供了一个在输入端处理处理服务器包含文件(SSI)的过滤器,目前支持SSI命令的列表是不完整的)

--without-http_userid_module 禁用ngx_http_userid_module支持(该模块用来处理用来确定客户端后续请求的cookies)

--without-http_access_module 禁用ngx_http_access_module支持(该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于ip地址)

--without-http_auth_basic_module禁用ngx_http_auth_basic_module(该模块是可以使用用户名和密码基于http基本认证方法来保护你的站点或其部分内容)

--without-http_autoindex_module 禁用disable ngx_http_autoindex_module支持(该模块用于自动生成目录列表,只在ngx_http_index_module模块未找到索引文件时发出请求。)

--without-http_geo_module 禁用ngx_http_geo_module支持(创建一些变量,其值依赖于客户端的IP地址)

--without-http_map_module 禁用ngx_http_map_module支持(使用任意的键/值对设置配置变量)

--without-http_split_clients_module 禁用ngx_http_split_clients_module支持(该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等)

--without-http_referer_module 禁用disable ngx_http_referer_module支持(该模块用来过滤请求,拒绝报头中Referer值不正确的请求)

--without-http_rewrite_module 禁用ngx_http_rewrite_module支持(该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。如果在server级别设置该选项,那么他们将在 location之前生效。如果在location还有更进一步的重写规则,location部分的规则依然会被执行。如果这个URI重写是因为location部分的规则造成的,那么 location部分会再次被执行作为新的URI。 这个循环会执行10次,然后Nginx会返回一个500错误。)

--without-http_proxy_module 禁用ngx_http_proxy_module支持(有关代理服务器)

--without-http_fastcgi_module 禁用ngx_http_fastcgi_module支持(该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。 )FastCGI一个常驻型的公共网关接口。

--without-http_uwsgi_module 禁用ngx_http_uwsgi_module支持(该模块用来医用uwsgi协议,uWSGI服务器相关)

--without-http_scgi_module 禁用ngx_http_scgi_module支持(该模块用来启用SCGI协议支持,SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计 更容易实现。)

--without-http_memcached_module 禁用ngx_http_memcached_module支持(该模块用来提供简单的缓存,以提高系统效率)

-without-http_limit_zone_module 禁用ngx_http_limit_zone_module支持(该模块可以针对条件,进行会话的并发连接数控制

--without-http_limit_req_module 禁用ngx_http_limit_req_module支持(该模块允许你对于一个地址进行请求数量的限制用一个给定的session或一个特定的事件)

--without-http_empty_gif_module 禁用ngx_http_empty_gif_module支持(该模块在内存中常驻了一个1*1的透明GIF图像,可以被非常快速的调用)

--without-http_browser_module 禁用ngx_http_browser_module支持(该模块用来创建依赖于请求报头的值。如果浏览器为modern ,则$modern_browser等于modern_browser_value指令分配的值;如 果浏览器为old,则$ancient_browser等于 ancient_browser_value指令分配的值;如果浏览器为 MSIE中的任意版本,则 $msie等于1)

--without-http_upstream_ip_hash_module 禁用ngx_http_upstream_ip_hash_module支持(该模块用于简单的负载均衡)

--with-http_perl_module 启用ngx_http_perl_module支持(该模块使nginx可以直接使用perl或通过ssi调用perl)

--with-perl_modules_path= 设定perl模块路径

--with-perl= 设定perl库文件路径

--http-log-path= 设定access log路径

--http-client-body-temp-path= 设定http客户端请求临时文件路径

--http-proxy-temp-path= 设定http代理临时文件路径

--http-fastcgi-temp-path= 设定http fastcgi临时文件路径

--http-uwsgi-temp-path= 设定http uwsgi临时文件路径

--http-scgi-temp-path= 设定http scgi临时文件路径

-without-http 禁用http server功能

--without-http-cache 禁用http cache功能

--with-mail 启用POP3/IMAP4/SMTP代理模块支持

--with-mail_ssl_module 启用ngx_mail_ssl_module支持

--without-mail_pop3_module 禁用pop3协议(POP3即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。是因特网电子邮件的第一个离线协议标 准,POP3协议允许用户从服务器上把邮件存储到本地主机上,同时根据客户端的操作删除或保存在邮件服务器上的邮件。POP3协议是TCP/IP协议族中的一员,主要用于 支持使用客户端远程管理在服务器上的电子邮件)

--without-mail_imap_module 禁用imap协议(一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。IMAP协议运行在TCP/IP协议之上, 使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。)

--without-mail_smtp_module 禁用smtp协议(SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。)

--with-google_perftools_module 启用ngx_google_perftools_module支持(调试用,剖析程序性能瓶颈)

--with-cpp_test_module 启用ngx_cpp_test_module支持

--add-module= 启用外部模块支持

--with-cc= 指向C编译器路径

--with-cpp= 指向C预处理路径

--with-cc-opt= 设置C编译器参数(PCRE库,需要指定–with-cc-opt=”-I /usr/local/include”,如果使用select()函数则需要同时增加文件描述符数量,可以通过–with-cc- opt=”-D FD_SETSIZE=2048”指定。)

--with-ld-opt= 设置连接文件参数。(PCRE库,需要指定–with-ld-opt=”-L /usr/local/lib”。)

--with-cpu-opt= 指定编译的CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

--without-pcre 禁用pcre库

--with-pcre 启用pcre库

--with-pcre= 指向pcre库文件目录

--with-pcre-opt= 在编译时为pcre库设置附加参数

--with-md5= 指向md5库文件目录(消息摘要算法第五版,用以提供消息的完整性保护)

--with-md5-opt= 在编译时为md5库设置附加参数

--with-md5-asm 使用md5汇编源

--with-sha1= 指向sha1库目录(数字签名算法,主要用于数字签名)

--with-sha1-opt= 在编译时为sha1库设置附加参数

--with-sha1-asm 使用sha1汇编源

--with-zlib= 指向zlib库目录

--with-zlib-opt= 在编译时为zlib设置附加参数

--with-zlib-asm= 为指定的CPU使用zlib汇编源进行优化,CPU类型为pentium, pentiumpro

--with-libatomic 为原子内存的更新操作的实现提供一个架构

--with-libatomic= 指向libatomic_ops安装目录

--with-openssl= 指向openssl安装目录

--with-openssl-opt 在编译时为openssl设置附加参数

--with-debug 启用debug日志


Nginx重新编译添加模块

原已经安装好的nginx,现在需要添加一个未被编译安装的模块,例如安装第三方的ngx_cache_purge模块(用于清除指定URL的缓存,从FastCGI、proxy、SCGI 和uWSGI缓存中增加内容清除功能。)

1、查看当前ngixn版本极其编译参数

/usr/local/nginx/sbin/nginx -V

2、找到安装nginx的源码根目录,如果没有的话下载新的源码

重新编译

./configure --user=www --group=www --add-module=../ngx_cache_purge-2.0 --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module

make

make后不要make install否则就覆盖安装了,make完之后在源码的objs目录下就多了个nginx,这个就是新版本的程序了

3、替换nginx二进制文件

cp /app/nginx/sbin/nginx /app/nginx/sbin/nginx.bak 

cp ./objs/nginx /app/nginx/sbin/

openresty在build/nginx-1.11.2/objs/nginx


安装配置naxsi waf防火墙


Naxsi是一个开放源代码、高效、低维护规则的Nginx web应用防火墙模块。Naxsi的主要目标是帮助人们加固他们的web应用程序,以抵御SQL注入、跨站脚本、跨域伪造请求、本地和远程文件包含漏洞。


下载Naxsi模块

Naxsi 不要求任何特定的依赖,它需要的 libpcre ,libssl ,zlib ,gzip 这些 Nginx 已经集成了。

git clone https://github.com/nbs-system/naxsi.git

wget http://naxsi.googlecode.com/files/naxsi-core-0.50.tgz

wget https://github.com/nbs-system/naxsi/archive/0.55.3.tar.gz


查看之前nginx的编译参数

nginx -V


进入nginx源码目录重新编译

步骤见Nginx重新编译添加模块,加上--add-module=~/naxsi_src 参数


nginx/naxsi 基本配置

将 naxsi 目录下的 naxsi_core.rules 拷贝至 nginx.conf 所在目录

备份nginx.conf文件


vim nginx.conf 

http 部分配置:

 http {

 include naxsi_core.rules;  #导入 naxsi 核心规则

 ...

}

server 部分配置:

location / {

   SecRulesEnabled;#开启 naxsi,关闭SecRulesDisabled

   LearningMode;#开启学习模式

   DeniedUrl "/50x.html"; #定义阻止请求的位置

   #CheckRules, 确定 naxsi 何时采取行动

   CheckRule "$SQL >= 8" BLOCK;

   CheckRule "$RFI >= 8" BLOCK;

   CheckRule "$TRAVERSAL >= 4" BLOCK;

   CheckRule "$EVADE >= 4" BLOCK;

   CheckRule "$XSS >= 8" BLOCK;

   error_log /.../foo.log;#naxsi 日志文件

   ...

  }

  error_page   500 502 503 504  /50x.html;

  #This is where the blocked requests are going

  location = /50x.html {

  return 418; #I'm a teapot \o/

  }


测试 nginx 配置

/nginx/sbin/nginx -t -c nginx.conf

ervice nginx reload


防御测试

浏览器中打开 http://www.test.com/?a=<>‘ ,出现 403 错误,并且在 foo.log 中出现 NAXSI_FMT 开头的日志。恭喜你 Naxsi 启用成功。


白名单规则

Naxsi 社区提供了一些常用的白名单规则,例如 wordpress 。可以在 https://github.com/nbs-system/naxsi-rules 下载白名单规则。

然后将规则 include 到 server 内的 location 中。重启 nginx 即可。不过目前这些白名单最近的修改日期显示是1年前~.~ ,可根据自身需要添加白名单规则。