Nginx特性:

基本功能:

静态资源的web服务器,能缓存打开的文件描述符

反向代理服务器丶缓存丶负载均衡:

支持FastCGI

模块化,非DSO机制,过滤器gzipSSI和图像大小调整

支持SSL

扩展功能:

基于名称和IP做虚拟主机

支持keepalive

支持平滑配置更新或程序版本升级

支持访问日志,支持使用日志缓存以提高性能

支持url rewrite

支持路径别名

支持基于IP及用户的认证

支持速率限制,并发限制等

Nginx的基本架构:

一个master,生成一个或多个worker

事件驱动:kqueueepool/dev/poll

支持sendfilesendfile64

文件AIO

支持mmap

Nginx:非阻塞、时间驱动、一个master多个worker、一个worker响应多个用户请求

 

Nginx的模块类别:

核心模块

标准的http模块

可选的http模块

邮件模块

第三方扩展模块


Nginx的配置文件:

main配置段

http{

 

}

配置参数需要以分号结尾

语法格式:  参数名  值1  [2 ...];

 

还支持使用变量:

模块内置变量

用户自定义变量

set  var_name  value

Nginx基本配置的类别:

用户调试、定位问题

正长运行的必备配置

优化性能的配置

事件类的配置

Worker进程应该以普通用户身份运行:nginx用户、nginx组:

HTTP的方法:GET, HEAD, POST, PUT, DELETE, 

 

 

 

Nginx配置文件必备的配置详解:

 正常运行的必备配置

1、user username [groupname]

指定运行worker进程的用户和组

2、pid /path/to/pidfile_name;

指定nginxpid文件

3、worker_rlimit_nofile #;

指定worker进程所能打开的最大文件据炳数;

4、worker_rlimit_sigpending #;

设定每个用户能够发往worker进程的信号的数量

优化性能相关的配置

1、worker_processes #;

worker进程的个数:通常其个数应该为CPU的物理核心数减1

2、worker_cpu_affinity cpumask ....;

绑定cpu

0000

0001

0010

0100

1000

worker_processes 6;

worker_cpu_affinity 00000001 00000010 00001000 00010000 00100000;

3、ssl_engine device;

在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备。

4timer_resoltion t;

每次内核事件调用返回时,都会使用gettimeofday()来更新nginx缓存时钟;

Timer_resolution 用于定义每隔多久才会由gettimeofday()来更新一次缓存时钟;x86-64系统上,gettimeofday()代价已经很小,可以忽略此配置;

5、work_priority nice;

-20,19之间的值

例如:work_priority -10;


事件相关的配置

1、accept_mutex [on|off]

是否打开nginx负载均衡,此锁能够让多个worker进行轮流地、序列化地与新的用户建立连接;而通常当一个worker进程的负载达到7/8.master就尽可能不再将请求调度次worker;

2、lock_file /path/to/lock_file

lock文件

3、accept_mutex_delay #ms;

accept锁模式种,一个worker进程为取得accept锁的等待时长;如果某worker进程在某次试图取得锁时失败了,至少等待#ms才能再一次请求锁;

4、multi_accept on|off;

是否允许一次性地响应多个用户请求;

5、use [epoll|rtsig|select|poll]

定义使用的事件模型,建议让nginx自动选择;

6、worker_connections #;

每个worker能够并发响应的并发请求数。

用于调试、定位问题:只调试nginx时使用

1、daemon [on|off];

是否让nginx运行后台,默认为on,调试时可以设置为off,使得所有信息都去接输出控制台;

2、master_process [on|off]

是否以master/worker模式运行nginx;默认为on;调试时可设置为off以方便追踪;

3、error_log /path/to/error.log level;

调试日志文件及其级别;默认为error级别,调试时可以使用debug级别,但要求在编译时必须使用 --with-debug启用debug功能;

 

nginxhttp功能:

必须使用虚拟主机来配置站点,每个虚拟主机使用一个server{}段配置;

Server{

 

}

非虚拟主机的配置或公共配置,需要定义在server之外,http之内。

 

1、server{}

定义一个虚拟主机;nginx支持使用基于主机名或IP的虚拟主机;

2、listen

listen address[:port];

Listen port

 

default_server:定义次server为http中默认的server;如果所有的server中没有任何一个listen使用此参数,那么第一个server为默认server。

rcvbuf=SIZE;接受缓冲大小;

sndbuf=SIZE;发送缓冲大小;

ssl;https server;

3、server_name [...];

server_name可以跟多个主机名,名称可以使用通配符;当nginx收到一个请求时,会取出其首部的server的值而后跟众server_name进行比较;

比较方式:

(1)先做精确匹配;  www.zx.com

(2)左侧通配符匹配; *.zx.com

(3)右侧通配符匹配; www.abc.com,www.*

(4)正则表达式匹配;

 

4、server_name_hash_bucket_size 32|64|128;

为了实现快速查找,nginx使用hash表来保存主机名;

 

Nginx安装:

编译安装

rpm包安装

编译安装:

 

首先添加用户nginx,实现以之运行nginx服务进程:

# groupadd -r nginx

# useradd -r -g nginx nginx

 

yum groupinstall "Development Tools" "Server Platform Development" -y

 

yum -y install pcre-devel 

 

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

 

tar zxvf nginx-1.6.3.tar.gz

 

cd nginx-1.6.3.tar.gz

 ./configure \

  --prefix=/usr/local/nginx \

  --sbin-path=/usr/sbin/nginx \

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

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

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

  --with-pcre&&make && make install

 

安装后调整:

配置启动脚本

 

#!/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:      /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' -`

   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

 

而后为此脚本赋予执行权限:

# chmod +x /etc/rc.d/init.d/nginx

 

添加至服务管理列表,并让其开机自动启动:

# chkconfig --add nginx

# chkconfig nginx on

 

而后就可以启动服务并测试了:

# service nginx start

配置文件修改

vim /etc/nginx/nginx.conf

全局:

worker_processes  6; (建议是物理cpu核心数减一)

worker_rlimit_nofile 99999;

http{

keepalive_timeout  5

}

 

1、虚拟主机配置:

    server {

        listen       80 default_server;

        server_name  www.b.com;

        root html/b.com;

       }

 

 

 

 

2、Ip访问控制

 server {

        listen       80 default_server;

        server_name  www.b.com;

        root html/b.com;

        allow 192.168.19.140;

        deny 192.168.19.;

        deny all;

}

3、用户控制

    server {

        listen       80 default_server;

        server_name  www.b.com;

        root html/b.com;

        #allow 192.168.19.;

        #deny 192.168.19.;

        #deny all;

        location /admin/{

                root html/b.com;

                auth_basic "admin area";

                auth_basic_user_file /etc/nginx/.htpasswd;

 

        }

}

建立用户认证文件:

htpasswd -c -m /etc/nginx/.htpasswd tom

4、建立下载站点

    server {

        listen       80 default_server;

        server_name  www.b.com;

        root html/b.com;

        location /download/ {

                root html/b.com/;

                autoindex on;

        }

防盗链(盗链:其他网站使用你网站的图片,他的服务器负载很小,但是你的负载很大,而且访问的地址还是其他网站)

(1)定义合规的引用

valid_referers none | blocked | server_name |string ...;

(2)拒绝

if   ($invalid_referer)  { 

rewrite  ^/.*  http://www.b.com/403.html

}

(3)例如

        location ~* \.(jpg|png|gif|jpeg)$ {

                root html/b.com/p_w_picpaths/;

                valid_referers none blocked www.b.com *.b.com;

                if ($invalid_referer) {

                        rewrite ^/ http://www.b.com/403.html;

                }

        }

 

6、地址重写(rewrite)

rewrite regex replacement [flag];基于正则表达式的查找替换

   正则表达式  替换    [标志位]

location / {

root html/b.com

rewrite ^/bbs/(.*)$ http://www.cc.com/$1 break; 

}

http://www.b.com/bbs/a.jpg --> http://www.cc.com/a.jpg

http://www.b.com/bbs/a.php --> http://www.cc.com/a.jpg

http://www.c.com/bbs/a.php --> http://www.cc.com/a.jpg

http://www.c.com/bbs/a.jpg --> http://www.cc.com/a.jpg

 

last:一旦当前规则匹配并重写后立即停止检查后续的其他rewrite,而通过重写后的规则重新发起请求;

break:一旦当前规则匹配并重写后立即停止检查后续的其他rewrite,而后继续由nginx进行后续的操作;

redirect:返回302临时重定向;

permanent:返回301永久重定向;

rewrite   ^(/download/.*)/media/(.*)\..*$   $1/mp3/$2.mp3   break ;

Nginx 最多循环10次; 超出之后返回500错误。

 

rewrite ^/download/(.*\.(jpg|gif|jpeg|png)$) /p_w_picpaths/$1 break;

凡是访问download下以(jpg|gif|jpeg|png)结尾的 都转到p_w_picpaths下以(jpg|gif|jpeg|png)结尾的

注意:一般将rewrite卸载location中时都是用break标记,或者将rewrite卸载if上下文中;

 

rewrite_log on|off

   是否把重写过程记录在错误日志中;默认级别为notice级别  默认off

return code

用于结束rewrite规则;并且为客户返回状态码;可以使用的状态码有:204,400,402-406,500-504等;

if  (condition) {

 

}

 

 

 

 

7、压缩

压缩

 

nginx将响应报文发送至客户端之前可以启用压缩功能,这能够有效地节约带宽,并提高响应至客户端的速度。通常编译nginx默认会附带gzip压缩的功能,因此,可以直接启用之。

 

http {

gzip on;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json;

gzip_disable msie6;

}

 

动静分离:

Php

location / {

proxy_pass http://location

}

location ~ .php${

fastcgi_pass http://192.168.100.20

}

 

1. #配置发布目录为/data/www/wugk

2. root /data/www/wugk;

3. 

4. location /

5. {

6. proxy_next_upstream http_502 http_504 error timeout invalid_header;

7. proxy_set_header Host $host;

8. proxy_set_header X-Real-IP $remote_addr;

9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

10. proxy_pass http://tdt_wugk;

11. expires 3d;

12. }

13. #动态页面交给http://tdt_wugk,也即我们之前在nginx.conf定义的upstream tdt_wugk 均衡

14. location ~ .*\.(php|jsp|cgi)?$

15. {

16. proxy_set_header Host $host;

17. proxy_set_header X-Real-IP $remote_addr;

18. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

19. proxy_pass http://tdt_wugk;

20. }

21. #配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。

22. location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$

23. {

24. root /data/www/wugk;

25. #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力

26. expires 3d;

27. }

 

 

 

生产配置:

#!/bin/bash

#user                              nobody nobody;

worker_processes                  4;

worker_rlimit_nofile              51200;

 

error_log                         logs/error.log  notice;

 

pid                               /var/run/nginx.pid;

 

events {

  use                             epoll;

  worker_connections              51200;

}

 

http {

  server_tokens                   off;

  include                         mime.types;

 

  proxy_redirect                off;

  proxy_set_header              Host $host;

  proxy_set_header              X-Real-IP $remote_addr;

  proxy_set_header              X-Forwarded-For $proxy_add_x_forwarded_for;

  client_max_body_size          20m;

  client_body_buffer_size       256k;

  proxy_connect_timeout         90;

  proxy_send_timeout            90;

  proxy_read_timeout            90;

  proxy_buffer_size             128k;

  proxy_buffers                 4 64k;

  proxy_busy_buffers_size       128k;

  proxy_temp_file_write_size    128k;

 

  default_type                    application/octet-stream;

  charset                         utf-8;

  

  client_body_temp_path           /var/tmp/client_body_temp 1 2;

  proxy_temp_path                 /var/tmp/proxy_temp 1 2;

  fastcgi_temp_path               /var/tmp/fastcgi_temp 1 2;

  uwsgi_temp_path                 /var/tmp/uwsgi_temp 1 2;

  scgi_temp_path                  /var/tmp/scgi_temp 1 2;

 

  ignore_invalid_headers          on;

  server_names_hash_max_size      256;

  server_names_hash_bucket_size   64;

  client_header_buffer_size       8k;

  large_client_header_buffers     4 32k;

  connection_pool_size            256;

  request_pool_size               64k;

 

  output_buffers                  2 128k;

  postpone_output                 1460;

 

  client_header_timeout           1m;

  client_body_timeout             3m;

  send_timeout                    3m;

 

 

  log_format main                 '$server_addr $remote_addr [$time_local] $msec+$connection '

                                  '"$request" $status $connection $request_time $body_bytes_sent "$http_referer" '

                                  '"$http_user_agent" "$http_x_forwarded_for"';

 

  open_log_file_cache               max=1000 inactive=20s min_uses=1 valid=1m;

 

  access_log                      logs/access.log      main;

  log_not_found                   on;

 

 

  sendfile                        on;

  tcp_nodelay                     on;

  tcp_nopush                      off;

 

  reset_timedout_connection       on;

  keepalive_timeout               10 5;

  keepalive_requests              100;

 

 

  gzip                            on;

  gzip_http_version               1.1;

  gzip_vary                       on;

  gzip_proxied                    any;

  gzip_min_length                 1024;

  gzip_comp_level                 6;

  gzip_buffers                    16 8k;

  gzip_proxied                    expired no-cache no-store private auth no_last_modified no_etag;

  gzip_types                      text/plain application/x-javascript text/css application/xml application/json;

  gzip_disable                    "MSIE [1-6]\.(?!.*SV1)";

 

 

  upstream tomcat8080 {

    ip_hash;

 

    server                        172.16.100.103:8080 weight=1 max_fails=2;

    server                        172.16.100.104:8080 weight=1 max_fails=2;

    server                        172.16.100.105:8080 weight=1 max_fails=2;

  }

 

  server {

    listen                        80;

    server_name                   www.magedu.com;

    # config_apps_begin

    root                          /data/webapps/htdocs;

    access_log                    /var/logs/webapp.access.log     main;

    error_log                     /var/logs/webapp.error.log      notice;

 

    location / {

    

      location ~* ^.*/favicon.ico$ {

        root                      /data/webapps;

        expires                   180d;

        break;

      }

    

      if ( !-f $request_filename ) {

        proxy_pass                http://tomcat8080;

        break;

      }

    }

 

    error_page                    500 502 503 504  /50x.html;

      location = /50x.html {

      root                        html;

    }

  }

 

  server {

    listen                        8088;

    server_name                   nginx_status;

 

      location / {

          access_log                  off;

          deny                        all;

          return                      503;

      }

 

      location /status {

          stub_status                 on;

          access_log                  off;

          allow                       127.0.0.1;

          allow                       172.16.100.71;

          deny                        all;

      }

  }

 

}