nginx运维实战之开山篇-安装时优化实战


本次博文议程如下:

wKioL1WbYd-i4rQAAAH7AjVoMsM453.jpg

1.1 NGINX安装和基本优化

 

 

 

测试环境:centos6.5 x64 ip 192.168.1.62

安装前基本优化详见

wKioL1WbZiawvQRDAACmy0t15lo452.jpg



1.1.1 隐藏版本

 

为了防止被黑客扫描到web服务器信息,通过相对应的web服务器信息找出对应的版本漏洞,从而对web服务器进行入侵,nginx虽然功能强大,但是也是软件,软件就可能会有漏洞,例如nginx-0.6.32版本,默认情况下可能导致服务器错误的将任何类型的文件以php的方式进行解析,比如上传一个jpg格式的木马到论坛网站,通过漏洞解析成一个php的webshell,从而入侵获得服务器的权限,这将导致严重的安全问题,使得黑客可能攻陷支持php的nginx服务器。如果暴漏了nginx版本而且该版本又存在安全漏洞那么你的web服务器肯定危在旦夕了。

针对于nginx服务器,可以修改源码中关于nginx的header描述信息,以下以最新稳定版nginx-1.4.7版本为例。

 wget http://nginx.org/download/nginx-1.4.7.tar.gz

先看下下面的例子

wKiom1WbYK_x9Z5eAAQ4KXlNAuk141.jpg

wKioL1WbYn2QjhicAAOd84ev1hU614.jpg

wKiom1WbYK-CGyApAAHXa5ig42Q647.jpg

wKioL1WbYn2xZuyKAAIbGXmd00o763.jpg

wKiom1WbYLDC6jD-AAIIsHJOdY0638.jpg

wKioL1WbYn6haX9UAALmJAmh41k720.jpg

wKiom1WbYLDiLeCwAAQLtPaQTJQ729.jpg

wKiom1WbYLCToULUAAGaiHygWmQ955.jpg

下面使用专业的强大的namp工具来扫描下

[root@localhost~]#

[root@localhost~]# nmap -A -T4  sS -sV -o  192.168.1.85 

-A 开启全面扫描 -T指定模板(0-5) sS TCP/SYN包探测  -sV - o设置进行版本探测

StartingNmap 5.51 ( http://nmap.org ) at 2014-12-03 16:26 CST

Failedto resolve given hostname/IP: sS.  Notethat you can't use '/mask' AND '1-4,7,100-' style IP ranges

WARNING:No targets were specified, so 0 hosts scanned.

Nmapdone: 0 IP addresses (0 hosts up) scanned in 0.84 seconds

[root@localhost~]# nmap -T4 -A -vvv www.baidu.com

StartingNmap 5.51 ( http://nmap.org ) at 2014-12-03 16:26 CST

NSE:Loaded 57 scripts for scanning.

NSE:Starting runlevel 1 (of 2) scan.

NSE:Starting runlevel 2 (of 2) scan.

Warning:Hostname www.baidu.com resolves to 2 IPs. Using 122.135.169.121.

InitiatingPing Scan at 16:26

Scanningwww.baidu.com (122.135.169.121) [4 ports]

CompletedPing Scan at 16:26, 0.01s elapsed (1 total hosts)

InitiatingParallel DNS resolution of 1 host. at 16:26

CompletedParallel DNS resolution of 1 host. at 16:26, 0.00s elapsed

DNSresolution of 1 IPs took 0.01s. Mode: Async [#: 2, OK: 0, NX: 1, DR: 0, SF: 0,TR: 1, CN: 0]

InitiatingSYN Stealth Scan at 16:26

Scanningwww.baidu.com (122.135.169.121) [1000 ports]

Discoveredopen port 443/tcp on 122.135.169.121

Discoveredopen port 80/tcp on 122.135.169.121

CompletedSYN Stealth Scan at 16:26, 3.36s elapsed (1000 total ports)

InitiatingService scan at 16:26

Scanning2 services on www.baidu.com (122.135.169.121)

CompletedService scan at 16:27, 18.77s elapsed (2 services on 1 host)

InitiatingOS detection (try #1) against www.baidu.com (122.135.169.121)

RetryingOS detection (try #2) against www.baidu.com (122.135.169.121)

InitiatingTraceroute at 16:27

CompletedTraceroute at 16:27, 3.02s elapsed

InitiatingParallel DNS resolution of 8 hosts. at 16:27

CompletedParallel DNS resolution of 8 hosts. at 16:27, 0.49s elapsed

DNSresolution of 8 IPs took 0.49s. Mode: Async [#: 2, OK: 2, NX: 6, DR: 0, SF: 0,TR: 8, CN: 0]

NSE:Starting runlevel 1 (of 2) scan.

NSE:Script scanning 122.135.169.121.

InitiatingNSE at 16:27

CompletedNSE at 16:27, 0.23s elapsed

NSE:Starting runlevel 2 (of 2) scan.

Nmapscan report for www.baidu.com (122.135.169.121)

Hostis up (0.0074s latency).

Otheraddresses for www.baidu.com (not scanned): 122.135.169.125

Scannedat 2014-12-03 16:26:44 CST for 31s

Notshown: 998 filtered ports

PORT    STATE SERVICE    VERSION

80/tcp  open  http      Apache httpd

|http-robots.txt: 8 disallowed entries

|_/baidu/s? /ulink? /link? /shifen/ /homepage/ /cpro /

|_http-methods:No Allow or Public header in OPTIONS response (status code 302)

Warning:OSScan results may be unreliable because we could not find at least 1 open and1 closed port

Devicetype: switch

Running(JUST GUESSING): HP embedded (86%)

OSfingerprint not ideal because: Missing a closed TCP port so results incomplete

AggressiveOS guesses: HP 4000M ProCurve switch (J4121A) (86%)

Noexact OS matches for host (test conditions non-ideal).

TCP/IPfingerprint:

SCAN(V=5.51%D=12/3%OT=80%CT=%CU=%PV=N%DS=10%DC=T%G=N%TM=547EC963%P=x86_64-redhat-linux-gnu)

SEQ(SP=104%GCD=1%ISR=10B%TI=RD%II=RI%TS=U)

SEQ(SP=103%GCD=1%ISR=10B%TI=RD%II=RI%TS=U)

OPS(O1=W7NM5A0NNNNNNNNNNS%O2=M578W7SNNNNNNNNNNL%O3=NNNNNNNNNNNNW7NM280%O4=M5A0SNNNNNNNNNNW7L%O5=M218SNNNNNNNNNNW7L%O6=M109SNNNNNNNNNN)

WIN(W1=1%W2=3F%W3=4%W4=4%W5=10%W6=200)

ECN(R=Y%DF=N%TG=40%W=3%O=W7NM5A0SNN%CC=N%Q=RU)

T1(R=Y%DF=N%TG=40%S=O%A=S+%F=AS%RD=0%Q=)

T2(R=N)

T3(R=N)

T4(R=N)

U1(R=N)

IE(R=Y%DFI=S%TG=40%CD=S)

 

NetworkDistance: 10 hops

TCPSequence Prediction: Difficulty=259 (Good luck!)

IPID Sequence Generation: Randomized

 

TRACEROUTE(using port 443/tcp)

HOPRTT      ADDRESS

1   8.65 ms 192.168.1.254

2   16.00 ms localhost (192.168.0.1)

3   18.47 ms 123.117.80.1

4   18.74 ms 122.51.54.41

5   21.25 ms 123.126.8.197

6   19.47 ms bt-230-122.bta.net.cn(202.106.230.122)

7   27.79 ms 122.49.168.90

8   ... 9

10  21.05 ms 122.135.169.121

 

NSE:Starting runlevel 1 (of 2) scan.

NSE:Starting runlevel 2 (of 2) scan.

Readdata files from: /usr/share/nmap

OSand Service detection performed. Please report any incorrect results athttp://nmap.org/submit/ .

Nmapdone: 1 IP address (1 host up) scanned in 31.76 seconds

           Raw packets sent: 2088 (95.556KB) |Rcvd: 36 (2.686KB)



wKioL1WbYsDS_B5eAAIyGWiknT0941.jpg

 
tarxf nginx-1.4.7.tar.gz
cdnginx-1.4.7/src/core 
sed-i -e 's/1.4.7//g' -e 's/nginx\//WS/g' -e's/"NGINX"/"WS"/g' nginx.h



1.1.2.取消debug模式

在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆字节。在编译前取消Nginxdebug模式,编译完成后Nginx只有几百千字节,因此可以在编译之前,修改相关源码,取消debug模式,具体方法如下: Nginx源码文件被解压后,找到源码目录下的auto/cc/gcc文件,在其中找到如下几行:

# debug

CFLAGS=$CFLAGS -g

注释掉或删除

cd/usr/local/src/nginx-1.4.7/auto/cc

sed-i '173,174d' gcc

[root@localhostcc]# ll /usr/local/src/nginx-1.4.7/auto/cc/gcc

-rw-r--r--.1 1001 1001 3523 Dec  3 14:57 /usr/local/src/nginx-1.4.7/auto/cc/gcc


wKiom1WbYUKhdUPqAAK-LtFhkNo936.jpg



1.1.3为特定的CPU指定CPU类型编译优化

在编译Nginx时,默认的GCC编译参数是“-O”,要优化GCC编译,可以使用以下两个参数:

--with-cc-opt='-O3'

--with-cpu-opt=CPU  #为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

要确定CPU类型,可以通过如下命令:

[root@localhostcc]# cat /proc/cpuinfo | grep "model name"

model name      : Intel(R) Core(TM) i5-3337U CPU @1.80GHz

wKioL1WbY1LBh0yeAAC8ITIXaDU432.jpg




1.1.4.利用TCMalloc优化Nginx的性能

TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具“google-perftools”中的一个成员。与标准的glibc库的malloc相比,TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低系统负载。下面简单介绍如何为Nginx添加TCMalloc库支持。 要安装TCMalloc库,需要安装libunwind32位操作系统不需要安装)和google-perftools两个软件包,libunwind库为基于64CPU和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。下面介绍利用TCMalloc优化Nginx的具体操作过程:

 

A)安装libunwind库

可以从http://download.savannah.gnu.org/releases/libunwind下载相应的libunwind版本,这里下载的是libunwind-1.1-alpha.tar.gz,安装过程如下

yum-y install gcc gcc-c++

wgethttp://ftp.twaren.net/Unix/NonGNU//libunwind/libunwind-1.1.tar.gz

tarxf libunwind-1.1.tar.gz

cdlibunwind-1.1

CFLAGS=-fPIC./configure

makeCFLAGS=-fPIC

makeCFLAGS=-fPIC install





B)安装google-perftools

可以从http://google-perftools.googlecode.com下载相应的google-perftools版本,这里下载的是google-perftools-2.1.tar.gz,安装过程如下:

wKioL1WbY6nwgWC0AAETrZeitsQ733.jpg

 

wgethttp://pkgs.fedoraproject.org/repo/pkgs/gperftools/gperftools-2.2.1.tar.gz/47cbede9442764f9e8fbc403af6cacfd/gperftools-2.2.1.tar.gz

tarxf gperftools-2.2.1.tar.gz

cdgperftools-2.2.1

./configure

make && make install

echo"/usr/local/lib" >/etc/ld.so.conf.d/usr_local_lib.conf

至此,google-perftools安装完成。

1.1.5.为google-perftools添加线程目录

创建一个线程目录,这里将文件放在/tmp/tcmalloc下,操作如下:

mkdir/tmp/tcmalloc

chmod0777 /tmp/tcmalloc

wKiom1WbYgeRVACFAACXHJbZOeE804.jpg






1.1.6.添加作为缓存服务器的插件

wKiom1WbYj6RUu2PAAEVMesff90190.jpg

wget-c http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz

mkdir/usr/local/ngxcache2.1

tarxf ngx_cache_purge-2.1.tar.gz -C /usr/local/ngxcache2.1



1.1.7.修改Nginx主配置文件

修改nginx.conf文件,在pid这行的下面添加如下代码:

#pid        logs/nginx.pid;

google_perftools_profiles/tmp/tcmalloc;

接着,重启Nginx,完成google-perftools的加载。

这里使用sed直接进行修改

sed-i '/pid/a google_perftools_profiles /tmp/tcmalloc;'/usr/local/nginx/conf/nginx.conf

重启nginx,重启好痛苦,没有systemV风格的脚本哦!哈哈.....

为了验证google-perftools已经正常加载,通过如下命令查看:

wKioL1WbZDHSZPS5AACBpRdKGj8797.jpg




[root@localhost~]# lsof -n |grep tcmalloc

nginx     27675 www    9w      REG                8,2        0    662310 /tmp/tcmalloc.27675

nginx     27676 www   11w      REG                8,2        0    662309 /tmp/tcmalloc.27676

nginx     27677 www   13w      REG                8,2       0     662308 /tmp/tcmalloc.27677

nginx     27678 www   15w      REG                8,2        0    662307 /tmp/tcmalloc.27678

 

 

 

1.1.8.正式安装nginx

安装Nginx软件所需模块及开发环境

yum-y install gcc gcc-c++ openssl-devel pcre-devel

创建管理Nginx服务的用户和组

useraddwww -s /sbin/nologin -M && id www

./configure\

--user=www\

--group=www\

--prefix=/usr/local/nginx\

--with-http_stub_status_module\

--with-http_ssl_module\

--with-google_perftools_module\

--with-http_gzip_static_module\

--add-module=/usr/local/ngxcache2.1/ngx_cache_purge-2.1

make&& make install

wKiom1WbYriAG8MOAAI4Dcr75rs825.jpg



[root@localhost~]# /usr/local/nginx/sbin/nginx

[root@localhost~]# ps -ef |grep nginx

root     25242    1  0 15:55 ?        00:00:00 nginx: master process/usr/local/nginx/sbin/nginx

www      25243 25242  0 15:55 ?        00:00:00 nginx: worker process     

root     25245 1051  0 15:55 pts/0    00:00:00 grep --color nginx

[root@localhost~]# curl -I 192.168.1.85

HTTP/1.1200 OK

Server:WS

Date:Wed, 03 Dec 2014 07:55:34 GMT

Content-Type:text/html

Content-Length:1222

Last-Modified:Wed, 03 Dec 2014 07:54:37 GMT

Connection:keep-alive

ETag:"547ec1bd-264"

Accept-Ranges:bytes

 wKioL1WbZKTjc2i1AAHfnPUUInU372.jpg







1.1.9 针对Nginx内核参数优化

内核参数的优化,主要是在Linux系统中针对Nginx应用而进行的系统内核参数优化,常见的优化参数值如下。

 

下面给出一个优化实例以供参考:

cat<<EOF >>/etc/sysctl.conf

net.ipv4.tcp_max_tw_buckets= 6000

net.ipv4.ip_local_port_range= 1024 65000

net.ipv4.tcp_tw_recycle= 1

net.ipv4.tcp_tw_reuse= 1

net.ipv4.tcp_syncookies= 1

net.core.somaxconn= 262144

net.core.netdev_max_backlog= 262144

net.ipv4.tcp_max_orphans= 262144

net.ipv4.tcp_max_syn_backlog= 262144

net.ipv4.tcp_synack_retries= 1

net.ipv4.tcp_syn_retries= 1

net.ipv4.tcp_fin_timeout= 1

net.ipv4.tcp_keepalive_time= 30

EOF

sleep0.5

/sbin/sysctl-p

将上面的内核参数值加入/etc/sysctl.conf文件中,然后执行如下命令使之生效:

#/sbin/sysctl-p

下面是对实例中选项的含义进行介绍:

net.ipv4.tcp_max_tw_buckets参数用来设定timewait的数量,默认是180000,这里设为6000

net.ipv4.ip_local_port_range选项用来设定允许系统打开的端口范围。

net.ipv4.tcp_tw_recycle选项用于设置启用timewait快速回收。

net.ipv4.tcp_tw_reuse选项用于设置开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接。

net.ipv4.tcp_syncookies选项用于设置开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies进行处理。

net.core.somaxconn选项默认值是128这个参数用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此,需要结合并发请求数来调节此值。

net.core.netdev_max_backlog选项表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。

net.ipv4.tcp_max_orphans选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并打印出警告信息。这个限制只是为了防止简单的DoS攻击。不能过分依靠这个限制甚至人为减小这个值,更多的情况是增加这个值。

net.ipv4.tcp_max_syn_backlog选项用于记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128MB内存的系统而言,此参数的默认值是1024,对小内存的系统则是128

net.ipv4.tcp_synack_retries参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries选项表示在内核放弃建立连接之前发送SYN包的数量。

net.ipv4.tcp_fin_timeout选项决定了套接字保持在FIN-WAIT-2状态的时间。默认值是60秒。正确设置这个值非常重要,有时候即使一个负载很小的Web服务器,也会出现因为大量的死套接字而产生内存溢出的风险。

 

net.ipv4.tcp_keepalive_time选项表示当keepalive启用的时候,TCP发送keepalive消息的频度。默认值是2(单位是小时)。

 

 


 

 

 

附录

----------------nginx启动脚本----------------------

#!/bin/bash

#by zhuifeng 2014/11/01

# chkconfig: - 30 21

# description: http service.

# Source Function Library

. /etc/init.d/functions

# Nginx Settings

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

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

NGINX_PID="/usr/local/nginx/logs/nginx.pid"

RETVAL=0

prog="Nginx"

start() {

         echo -n$"Starting $prog: "

         mkdir -p/dev/shm/nginx_temp

         daemon$NGINX_SBIN -c $NGINX_CONF

         RETVAL=$?

         echo

         return $RETVAL

}

stop() {

         echo -n$"Stopping $prog: "

         killproc -p$NGINX_PID $NGINX_SBIN -TERM

         rm -rf/dev/shm/nginx_temp

         RETVAL=$?

         echo

         return $RETVAL

}

reload(){

         echo -n$"Reloading $prog: "

         killproc -p$NGINX_PID $NGINX_SBIN -HUP

         RETVAL=$?

         echo

         return $RETVAL

}

restart(){

         stop

         start

}

configtest(){

     $NGINX_SBIN -c $NGINX_CONF -t

     return 0

}

case "$1" in

   start)

         start

         ;;

   stop)

         stop

         ;;

   reload)

         reload

         ;;

   restart)

         restart

         ;;

   configtest)

         configtest

         ;;

   *)

         echo$"Usage: $0 {start|stop|reload|restart|configtest}"

         RETVAL=1

esac

exit $RETVAL

-----------------------nginx启动脚本-----------------------------

/etc/init.d/nginx restart&& chkconfig nginx on

 



本文出自 “追风-韩艳威-运维之路” 博客,转载请与作者联系!

你可能感兴趣的:(linux,nginx,nginx安装优化。加速库)