nginx 基础笔记

一、Nginx 优点

  1. 高性能web,可以支持反向代理

  2. 比Apache性能优越,支持更多的并发连接,但资源占用很少,轻量级的web服务器。可以支持高达50000个并发连接数的响应

  3. Nginx 在Linux 2.6+ 使用epoll模型,提供卓越性能

  4. 做为负载均衡服务器,可以在内部直接支持PHP和Rails,也可以支持作为HTTP代理服务器对外进行服务

  5. Nginx使用C编写,不能是系统资源开销还是CPU使用效率都比Perbal要好

  6. 支持邮件代理服务器,也是一款非常优秀的邮件代理服务器,Nginx早期其实是一个邮件代理服务器

  7. Nginx安装简单,配置文件简洁,还支持perl语言,bug很少,稳定性很好,几乎可以支持7&24小时不间断运行,还可以在实现在不间断提供服务情况实现平滑升级

  8. 在线帮助文档很丰富


二、软件获得及帮助文档

官方网址:http://nginx.org/

下载稳定版本:http://nginx.org/download/nginx-1.8.0.tar.gz

帮助文档:http://nginx.org/en/docs/

编译参数说明:http://nginx.org/en/docs/configure.html

三、软件安装

1、 ./configure –help 编译参数中文说明,可能不是很准确,敬请指正。

  • –with-rtsig_module。在Linux 2.2.19 内核默认情况下,实时信号连接不超过1024.使用rtsig模块可以突破这个限制。需要修改内核参数/proc/sys/kernel/rtsig-max,才能达到效果。centos 6.6没有这个内核参数,应该是不支持这个参数了。网上说Linux 2.6.6-mm2开始不再支持这个参数。centos 6.7的内核:2.6.32-504。这个参数在Linux2.6内核基本上不用了

  • –with-select_module select模式的性能同poll模块的性能相当。Linux内核2.6+的可以选择epoll模块

  • –with-threads 配置线程池。

  • –with-file-aio 开启通过异步I/0(允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成)的方式读取文件

    • 异步I/O:针对网络I/O 使用epoll模型,针对文件(设备)的I/O使用AI0

    • AIO的基本思想:允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成,稍后或在接收到I/O操作完成通知时,进程可以检索I/O操作结果。在异步非阻塞I/O中,我们可以同时发起多个传输操作,这需要每个传输操作都有唯一的上下文,这样我们才能在他们完成时区分到底是哪个传输操作完成了,这个工作可以通过aiocb结构体进行区分

  • –with-http_spdy_module  spdy是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。Linux的发行版提供的软件源里一般情况是不带这个功能,需要下载源码编译安装

  • –with-http_ssl_module 支持ssl

  • –with-http_realip_module 此模块支持显示真实来源IP地址,主要用于NGINX做前端负载均衡服务器使用,或者反向代理

  • –with-http_addition_module 游戏服务器不必安装,门户网站可以安装,有利于被搜索引擎收录页面信息。用于SEO:搜索引擎优化

  • –with-http_xslt_module 这个模块是一个过滤器,它可以通过XSLT模板转换XML应答。0.7.8后面版本才可以使用。

  • –with-http_image_filter_module 是nginx提供的集成图片处理模块,nginx-0.7.54以后的版本才可以使用。主要的功能:实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息。适用于访问不是太大,硬盘空间有限的情况下,高并发访问量不适合开启该模块

  • –with-http_geoip_module  Linux的发行版提供的软件源一般情况是不带这个功能,需要下载源码编译安装。获取客户端的IP地址,在IP地址数据库中查询该IP来自哪个国家/城市 不一定准,只能做参考,很多时候IP数据库里的数据不准确。

  • –with-http_sub_module 能够在nginx的应答响应报文中搜索并替换某些文本

  • –with-http_dav_module 为文件和目录指定权限,限制不同类型的用户对于页面有不同的操作权限

  • –with-http_auth_request_module 认证模块

  • –with-http_gzip_static_module:提供对静态文件预压缩。例如:提供一个index.html的文件,在nginx访问之前对文件进行压缩成index.html.gz 这样nginx访问的时候大大节约带宽和时间(不需要压缩),nginx访问的是index.html.gz这个文件。可以选择压缩比高的算法,虽说占CPU资源,但是不是在nginx访问的时候进行压缩,这样并没有太大的问题

  • –with-http_gzip_module:通过Linux发行版的软件仓库的方式安装是提供的。这个是对文件进行压缩,压缩比一般超过50%

  • –with-http_random_index_module 选择一个随机的主页

  • –with-http_secure_link_module 这个模块用于为所需的安全性“令牌”计算和检查请求URL。在0.7.18版本以上的Nginx中提供了该模块。默认安装不包括此模块。对于0.8.50之后的版,有添加了secure_link_md5指令和secure_link_expires变量,因此,secure_link_secret已经不赞成使用了

  • –with-http_degradation_module 允许在内存不足的情况下返回204或444码。204:无内容。444:无响应

  • –with-http_stub_status_module Nginx健康状态检测模块,做反向代理服务器的时候对后端服务器的存活状态进行检测

  • ngx_http_geo_module 可以创建一个变量,变量的值依赖于客户端的IP地址。默认是开启的。如果不使用–without-ngx_http_geo_module

  • –with-http_charset_module:向响应报文头部“Content-Type”字段添加指定的字符,可用于不同字符集之间的转换(不同的编码之间进行转换)不过有局限性。例如:从服务器到客户端,仅仅单字节的字符集能被进行转换或者单字节字符集能被转到utf8格式或者从utf8格式转到单字节字符集

  • –with-http_userid_module: 对登录的UID设置适当的cookies信息。相当于Apache的mod uid模块

  • –without-http_map_module: map指令依赖于此模块。创建变量依赖于其他的变量。允许分类或者同时映射多个值到多个不同值并储存到一个变量中,map指令用来创建变量,但是仅在变量被接受的时候执行视图映射操作,对于处理没有引用变量的请求时,这个模块并没有性能上的缺失。

  • –with-http_referer_module:基于RefererHTTP请求头对请求进行过滤.referer是 http的headers,告诉服务器此请求是从哪个页面过来的

  • –with-http_proxy_module:http代理模块,一般是反向代理

  • –with-http_empty_gif_module:异步统计使用1×1的空白图片传递统计参数,提高性能,空图片运行在内存中,比使用静态文件传递参数效率要高

  • –with-http_upstream_hash_module: nginx工作于负载均衡模型中由upstream将请求调度到上游服务器。hash模块执行hash运算的。

    调度算法:

    • ip_hash(源地址hash,将来自同一IP的请求调度同一个Real Server。可以解决session问题)、

    • 最小连接数,可以基于权重

    • 轮询,可以基于权重

    • fair:第三方,按后端服务器的响应时间来分配请求,响应时间短的优先分配)

    • url_hash:第三方,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,nginx为缓存服务器时比较有效

  • –with-http_upstream_keepalive_module:keepalive 常连接模块

  • –with-http_perl_module:Perl模块支持Perl脚本,比fast-cgi模型性能稍好

    • 解决依赖关系:yum -y install perl perl-devel perl-ExtUtils-Embed

    • –with-ld-opt="-Wl,-E"。加入perl模块,需要加上这项,否则会报错

  • –with-http_split_clients_module 该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等,禁用–without-http_split_clients_module

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

2、安装之前解决依赖关系。yum -y install pcre openssl-devel pcre-devel zlib-devel gcc

3、需要手动创建nginx组和nginx用户

    groupadd -r -g nginx

    useradd

4、安装nginx

 ./configure –prefix=/usr/local/nginx –user=nginx –group=nginx –with-threads –with-http_ssl_module –with-http_spdy_module –with-http_realip_module –with-http_addition_module –with-http_dav_module –with-http_gunzip_module –with-http_auth_request_module –with-http_gzip_static_module –with-http_degradation_module –with-http_stub_status_module  –http-log-path=/var/log/nginx.log  –with-http_perl_module –with-ld-opt="-Wl,-E" –error-log-path=/var/log/nginx_errorlog.log

注释:–with-ld-opt="-Wl,-E" 加入perl模块后需要加入这项,防止安装完成后启动nginx时报错。这项的作用优化C编译器

make && make instal

5、下面做的一些操作完全是为了保持使用yum方式安装的习惯:配置文件的路径,程序启动使用简单的命令而非完整的路径等

  • cp /usr/local/nginx/sbin/nginx
    /usr/sbin/nginx 这样可以在任意路径使用nginx命令,不需要使用完整的路径:/usr/locla/ngins/sbin/nginx。当nginx重新编译过后会产生新的nginx程序,这时候也要相应的将/usr/sbin/目录里的nginx也更新了。也可以通过修改环境变量PATH的方式:    echo "PATH=/usr/local/nginx/sbin/:$PATH" >> /etc/profile

     source /etc/profile #使其立即生效

  • 复制配置文件 mkdir /etc/nginx/ && cp /usr/local/nginx/conf/{nginx.conf,mime.types} /etc/nginx/

  • 创建nginx的启动脚本可以使用service方式启动,重启,查看状态以及重载配置文件等。vim /etc/init.d/nginx

    

#!/bin/sh

#

# nginx – this script starts and stops the nginx daemon

#

# chkconfig:   – 85 15   85表示启动顺序号,第85个启动,15代表关闭顺序号,第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:      /etc/sysconfig/nginx

# pidfile:     /var/run/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/sbin/nginx"

prog=$(basename $nginx)

 

NGINX_CONF_FILE="/etc/nginx/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' -`

   #nginx -V 2>&1 | grep "configure arguments:" | cut -d '-' -f 5 | cut -d '=' -f 2 等同于上面的代码的功能

   #[^*]* 表示把–user前面的内容去掉 \(表示转义 [^ ]* 表示零个,一个或多个非空白字符 \([^ ]*\) 表示被引用的对象,

   #后面的\1 就是引用这里括起来的内容

   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

}

#make_dirs 函数的作用是先获取nginx使用哪个用户进行运行,然后将下面这些路径的属主改为该用户。

#并且是递归的方式修改,也就是子文件夹及其里面所有文件的属主都为此用户。

# –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/ \

# –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

# –http-scgi-temp-path=/var/tmp/nginx/scgi \

 

start() {

    [ -x $nginx ] || exit 5 

    #-x 表示/usr/local/nginx 是否有执行的权限,有就执行下一条命令并返回0.如果没有就返回5并退出整个脚本

    [ -f $NGINX_CONF_FILE ] || exit 6  

    #-f 表示/etc/nginx/nginx.conf是否存在。存在执行下一条命令返回0.没有就返回6并退出整个脚本

    make_dirs

    echo -n $"Starting $prog: "

    daemon $nginx -c $NGINX_CONF_FILE #检查nginx的配置文件

    retval=$?

    echo

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

    return $retval

}

 

stop() {

    echo -n $"Stopping $prog: "

    killproc $prog -QUIT #运行killproc 需要先运行. /etc/rc.d/init.d/functions.

    #使用function脚本提供的PATH变量,umask,以及语言环境等。killproc也在此脚本中.

    #-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 #运行killproc 需要先运行. /etc/rc.d/init.d/functions 使用function脚本提供的PATH变量,

    RETVAL=$?    #umask,以及语言环境等。killproc也在此脚本中。-HUP 重载配置文件

    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 #如果在运行状态,就返回0并且停止执行当前脚本,否则调用start函数

        $1  #调用start() 函数

        ;;

    stop)

        rh_status_q || exit 0 #如果在运行状态,就调用stop函数,否则返回0并停止执行当前脚本

        $1 #调用stop() 函数

        ;;

    restart|configtest) #restart 或者configtest 这两个参数

        $1 #调用restart() 函数 或者调用configtest函数

        ;;

    reload)

        rh_status_q || exit 7

        $1 #调用reload() 函数

        ;;

    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

  • 需要给此脚本添加执行的权限。chomd o+x /etc/init.d/nginx

  • 设置开机自动启动 chkconfig -add nginx;chkconfig nginx on

  • 可以启动nginx:service nginx start

  • ss -utnlp | grep 80   #nginx已经启动,并且监听在80套字节上

    tcp    LISTEN     0      128                    *:80                    *:*      users:(("nginx",39796,6),("nginx",39797,6))

  • 尝试本机访问nginx

[root@firewall nginx]# curl http://localhost

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx!</h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>

<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>

</body>

</html>

至此nginx安装完成

nginx基础篇就写在这里,下一篇写nginx作为web服务器、web反向代理的具体实现。

原创文章,作者:jslijb,如若转载,请注明出处:http://www.178linux.com/12850

评论列表(2条)

  • stanley
    stanley 2016-03-19 22:24

    代码缺少格式化,难看了点

    • jslijb
      jslijb 2016-03-22 22:40

      @stanley上次说我没有格式化,我这次特定做了格式化,可是还是说没有格式化,那您能告诉我格式化的标准码?否则我不知道如何达到您的要求。