一、安装Nginx

#创建nginx用户

groupadd -r nginx

useradd -r -g nginx -s /bin/false -M nginx

#安装依赖包

yum install gcc openssl-devel pcre-develzlib-devel -y

 

#下载解压源码

cd /usr/src/

wget ftp://172.16.0.1/pub/Sources/sources/nginx/nginx-1.6.2.tar.gz

tar xf nginx-1.6.2.tar.gz

 

#编译安装

cd /usr/src/nginx-1.6.2

 

./configure --prefix=/usr/local/nginx--conf-path=/etc/nginx/nginx/nginx.conf --user=nginx --group=nginx--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 --with-http_ssl_module--with-http_stub_status_module --with-http_gzip_static_module--with-http_flv_module --with-http_mp4_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/fastcgi

 

make && make install

 

#启动nginx

mkdir /var/tmp/nginx/client -pv

/usr/local/nginx/sbin/nginx

 

#查看是否启动

lsof -i :80

[root@localhost sbin]# lsof -i :80

COMMAND  PID  USER   FD  TYPE DEVICE SIZE/OFF NODE NAME

nginx  22462  root    6u IPv4  57010      0t0 TCP *:http (LISTEN)

nginx   22463 nginx    6u IPv4  57010      0t0 TCP *:http (LISTEN)


#添加启动服务脚本

vi /etc/rc.d/init.d/nginx

#user nobody; 指定运行worker进程的用户

worker_processes  1; worker线程的个数,通常为物理CPU核心个数减1

 

#error_log logs/error.log;

#error_log logs/error.log  notice; 错误日志,后面是日志级别

#error_log logs/error.log  info;

#error_log /dev/null; 这样可以关闭日志记录

 

#pid       logs/nginx.pid; 指定nginxpid文件

 

#指定文件描述符数量
worker_rlimit_nofile 51200;

 

#工作模式及连接上限

events {
#use [ kqueue | rtsig | epoll | /dev/poll | select| poll ]; 使用的网络I/O模型

   worker_connections  1024; 单个进程的最大连接数

}

 

 

#设定http服务器

http {

    #设定浏览器请求的文件媒体类型

   include       mime.types;

   default_type application/octet-stream; 默认文件类型

 

    #设定日志格式

    #log_format main  '$remote_addr - $remote_user[$time_local] "$request" '

   #                  '$status$body_bytes_sent "$http_referer" '

   #                 '"$http_user_agent" "$http_x_forwarded_for"';

   

    #日志名称,和日志记录格式采用main以及存放位置

   #access_log  logs/access.log  main;

   

server_names_hash_bucket_size 128;
     #用于设置客户端请求的Header头缓冲区大小,大部分情况1KB大小足够。不能超过large_client_header_buffers缓冲区大小的设置
       client_header_buffer_size32k;
      #该指令用于设置客户端请求的Header头缓冲区大小,默认值为4KB
      large_client_header_buffers 4 32k;
    
      #设置客户端能够上传的文件大小,默认为1m
      client_max_body_size 8m;

 

    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件。请求的资源由内核获取后不再经过用户空间直接由内核封装后响应给请求方

sendfile        on;

   #tcp_nopush     on; 防止网络阻塞

 

   #keepalive_timeout  0;

   keepalive_timeout  65; 保持连接的超时时长,默认为65s

 

fastcgi_connect_timeout 300;
      fastcgi_send_timeout 300;
      #该指令用于设置upstream模块等待FastCGI进程发送数据的超时时间,默认值为60s
      fastcgi_read_timeout 200;
      #该指令设置FastCGI服务器相应头部的缓冲区大小。通常情况,该缓冲区大小设置等于fastcgi_buffers指令设置的一个缓冲区的大小。
      fastcgi_buffer_size 64k;
      #该指令设置了读取FastCGI进程返回信息的缓冲区数量和大小。
      fastcgi_buffers 4 64k;
    
      fastcgi_busy_buffers_size 128k;
      fastcgi_temp_file_writer_size 128k;

 

   #gzip  on;开启gzip模块

#该指令允许压缩的页面最小字节数
gzip_min_length 1k;
gzip_buffers 4 16k; #压缩缓冲区
#识别http的协议版本。
gzip_http_version 1.1;
#gzip压缩比,1 压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu
gzip_comp_level 2;
gzip_proxied any;#nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩)
#匹配mime类型进行压缩,无论是否指定,text/html类型总是会被压缩的。
gzip_types text/plain application/x-javascripttext/css application/xml;
gzip_vary on;#http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持
#所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩

 

    #定义一个虚拟主机

   server {

       listen       80; 虚拟机监听的服务器地址和端口号

       server_name  localhost; 可跟多个主机名,主机名可以使用通配符和正则表达式(~

 

       #charset koi8-r; 字符集,网站编码

 

       #access_log  logs/host.access.log  main; 设定本虚拟机的访问日志

 

       #允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理

       location / {

           root   html; 设置web资源路径映射,用于指明请求的URL所对应的文档的根目录路径

           index  index.html index.htm; 默认的主页面

       }

 

       #error_page  404              /404.html; 根据http状态码重定向错误页面

 

       # redirect server error pages to the static page /50x.html

       #

       error_page   500 502 503 504  /50x.html; 根据http状态码重定向错误页面

       location = /50x.html {

           root   html;

       }

 

       # proxy the PHP scripts to Apache listening on 127.0.0.1:80

       #php脚本代理给127.0.0.1:80处理(比如可以做apache处理后端)

       #location ~ \.php$ {

       #    proxy_pass   http://127.0.0.1;

       #}

 

       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

       #PHP脚本用FastCGI模式处理127.0.0.1:9000

       #location ~ \.php$ {

       #    root           html;

       #    fastcgi_pass   127.0.0.1:9000;

       #    fastcgi_index  index.php;

       #    fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

       #    include        fastcgi_params;

       #}

 

       # deny access to .htaccess files, if Apache's document root

       # concurs with nginx's one

       #文件禁止访问

       #location ~ /\.ht {

       #    deny  all;

       #}

    }

 

 

 

    #HTTPS server

    #支持ssl协议的虚拟机相关设置

   #server {

   #    listen       443 ssl;

   #    server_name  localhost;

 

   #    ssl_certificate      cert.pem; 服务器证书

   #    ssl_certificate_key  cert.key; 服务器私钥

 

   #    ssl_session_cache    shared:SSL:1m;

   #    ssl_session_timeout  5m;

 

   #    ssl_ciphers  HIGH:!aNULL:!MD5;

   #    ssl_prefer_server_ciphers  on;

 

   #    location / {

   #        root   html;

   #        index  index.html index.htm;

   #    }

   #}

 

}

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

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

 

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

# chkconfig --add nginx

# chkconfig nginx on

 

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

# service nginx start

二、配置Nginx

#nginx的配置文件

/etc/nginx/nginx/nginx.conf

#user nobody; 指定运行worker进程的用户

worker_processes  1; worker线程的个数,通常为物理CPU核心个数减1

 

#error_log logs/error.log;

#error_log logs/error.log  notice; 错误日志,后面是日志级别

#error_log logs/error.log  info;

#error_log /dev/null; 这样可以关闭日志记录

 

#pid       logs/nginx.pid; 指定nginxpid文件

 

#指定文件描述符数量
worker_rlimit_nofile 51200;

 

#工作模式及连接上限

events {
#use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 使用的网络I/O模型

   worker_connections  1024; 单个进程的最大连接数

}

 

 

#设定http服务器

http {

    #设定浏览器请求的文件媒体类型

   include       mime.types;

   default_type application/octet-stream; 默认文件类型

 

    #设定日志格式

   #log_format  main  '$remote_addr - $remote_user [$time_local]"$request" '

   #                  '$status$body_bytes_sent "$http_referer" '

   #                 '"$http_user_agent" "$http_x_forwarded_for"';

   

    #日志名称,和日志记录格式采用main以及存放位置

   #access_log  logs/access.log  main;

   

server_names_hash_bucket_size 128;
      #用于设置客户端请求的Header头缓冲区大小,大部分情况1KB大小足够。不能超过large_client_header_buffers缓冲区大小的设置
       client_header_buffer_size 32k;
      #该指令用于设置客户端请求的Header头缓冲区大小,默认值为4KB
      large_client_header_buffers 4 32k;
    
      #设置客户端能够上传的文件大小,默认为1m
      client_max_body_size8m;

 

    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件。请求的资源由内核获取后不再经过用户空间直接由内核封装后响应给请求方

sendfile        on;

   #tcp_nopush     on; 防止网络阻塞

 

   #keepalive_timeout  0;

   keepalive_timeout  65; 保持连接的超时时长,默认为65s

 

fastcgi_connect_timeout 300;
      fastcgi_send_timeout300;
      #该指令用于设置upstream模块等待FastCGI进程发送数据的超时时间,默认值为60s
      fastcgi_read_timeout200;
      #该指令设置FastCGI服务器相应头部的缓冲区大小。通常情况,该缓冲区大小设置等于fastcgi_buffers指令设置的一个缓冲区的大小。
      fastcgi_buffer_size64k;
      #该指令设置了读取FastCGI进程返回信息的缓冲区数量和大小。
      fastcgi_buffers 464k;
    
      fastcgi_busy_buffers_size128k;
      fastcgi_temp_file_writer_size128k;

 

   #gzip  on;开启gzip模块

#该指令允许压缩的页面最小字节数
gzip_min_length 1k;
gzip_buffers 4 16k; #压缩缓冲区
#识别http的协议版本。
gzip_http_version 1.1;
#gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理速度最慢(传输快但比较消耗cpu
gzip_comp_level 2;
gzip_proxied any;#nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩)
#匹配mime类型进行压缩,无论是否指定,text/html类型总是会被压缩的。
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;#http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持
#所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩

 

    #定义一个虚拟主机

   server {

       listen       80; 虚拟机监听的服务器地址和端口号

       server_name  localhost; 可跟多个主机名,主机名可以使用通配符和正则表达式(~

 

       #charset koi8-r; 字符集,网站编码

 

       #access_log logs/host.access.log  main; 设定本虚拟机的访问日志

 

       #允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理

       location / {

           root   html; 设置web资源路径映射,用于指明请求的URL所对应的文档的根目录路径

           index  index.html index.htm; 默认的主页面

       }

 

       #error_page  404              /404.html; 根据http状态码重定向错误页面

 

       # redirect server error pages to the static page /50x.html

       #

       error_page   500 502 503 504  /50x.html; 根据http状态码重定向错误页面

       location = /50x.html {

           root   html;

       }

 

       # proxy the PHP scripts to Apache listening on 127.0.0.1:80

       #php脚本代理给127.0.0.1:80处理(比如可以做apache处理后端)

       #location ~ \.php$ {

       #    proxy_pass   http://127.0.0.1;

       #}

 

       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

       #PHP脚本用FastCGI模式处理127.0.0.1:9000

       #location ~ \.php$ {

       #    root           html;

       #    fastcgi_pass  127.0.0.1:9000;

       #    fastcgi_index  index.php;

       #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

       #    include        fastcgi_params;

       #}

 

       # deny access to .htaccess files, if Apache's document root

       # concurs with nginx's one

       #文件禁止访问

       #location ~ /\.ht {

       #    deny  all;

       #}

    }

 

 

 

    #HTTPS server

    #支持ssl协议的虚拟机相关设置

   #server {

   #    listen       443 ssl;

   #    server_name  localhost;

 

   #    ssl_certificate      cert.pem; 服务器证书

   #    ssl_certificate_key  cert.key; 服务器私钥

 

   #    ssl_session_cache    shared:SSL:1m;

   #    ssl_session_timeout  5m;

 

   #    ssl_ciphers  HIGH:!aNULL:!MD5;

   #   ssl_prefer_server_ciphers  on;

 

    #   location / {

   #        root   html;

   #        index  index.html index.htm;

   #    }

   #}

 

}

修改配置文件后检查语法错误:

/usr/local/nginx/sbin/nginx –t或者configtest

 

配置详解:

虚拟主机相关的配置

1、  server {}

定义一个虚拟主机

 

2、  listen

完整格式 listenaddress[:port] [default_server] [ssl] [spdy] [proxy_protocol] [setfib=number][fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size][accept_filter=filter] [deferred] [bind] [ipv6only=on|off][so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

 

常用 listen address[:port] [default_server] ssl

 

例如:listen 172.16.100.8:8080

 

3server_name name[...];

后可跟多个主机名;名称还可以使用通配符和正则表达式(~);

1 先做精确匹配:www.test.com

2 左侧通配符匹配:例如:*.test.com

3 右侧通配符匹配:例如:www.*

4 正则表达式匹配:例如:~^.*\.magedu\.com$

5 default_server

 

4location [=|~|*~|^~]

功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location模块中的配置所处理;

=:精确匹配检查

~:正则表达式模式匹配,区分字符大小写

~*:正则表达式模式匹配,不区分字符大小写

^~:做URI的前半部分匹配,不检查正则表达式

匹配优先级:精确匹配(=)、^~~~*、没有任何符号,由打头的URL进行左侧匹配

 

5root

         设置web资源路径映射;用于指明请求的URL所对应的文档的根目录路径

 

         location/p_w_picpaths/ {

                   root“/web/imgs/”;

}

         假如域名是www.test.com,则用户请求访问资源http://www.test.com/p_w_picpaths/1.jpg时,实际是/web/imgs/p_w_picpaths/1.jpg

 

6alias path

         用于location配置段,定义路径别名

 

         location/p_w_picpaths/ {

                   alias/web/imgs/;

}

假如域名是www.test.com,则用户请求访问资源http://www.test.com/p_w_picpaths/1.jpg时,实际是/web/imgs/1.jpg

 

7index file

         默认主页面

                   indexindex.html;

 

8error_page code[...] [=code] URI | @name

         根据http状态码重定向错误页面

         error_page404 /404.html

 

         =[code]:以指明的响应码进行响应;省略code表示以新资源的响应码为响应码

 

9try_files

         try_filespath1[,path2,...] URI

         当用户访问URI,先先从path1匹配,如果找不到则匹配path2...,如果都找不到,则匹配最后一个路径参数path#

 

网络连接相关的配置:

1、  keepalive_timeout time;

保持连接的超时时长,默认为75

 

2、  keepalive_requests #;

在一次保持连接上允许承载最大资源请求数

 

3、  keepalive_disable [msie6|safari|none]

为指定类型的浏览器禁用长连接

 

4、  tcp_nodelay on|off

对长连接是否使用TCP_NODELAY选项

 

5、  client_header_timeout time;

读取http请求报文首部的超时时长

 

6、  client_body_timeout time;

读取http请求报文body部分的超时时长

 

7、  send_timeout time;

发送响应报文的超时时长

 

对客户端请求进行限制:

1、  limit_except METHOD {...}

指定范围之外的其他方法的访问控制;

 

limit_except GET {

           allow172.16.0.0/16;

           deny all;

}

 

2、  client_body_max_size SIZE;

限制请求报文中body部分的上限;通过检测请求报文首部中的“Content_length”来判定;

 

3、  limit_rate speed;

限制客户端每秒传输的字节数,默认为0,表示无限制

 

对内存或磁盘资源进行分配:

1client_body_in_file_only on|clean|off;

请求报文的body部分若大,是否可暂存于磁盘;on表示允许

 

2client_body_in_single_bufferon|off

请求报文的body部分是否可暂存在内存的buffer中,默认off;允许会提高性能

 

3client_body_buffer_sizesize;

暂存大小

 

4client_body_temp_pathDIR [level1 [level2 [level3 [level4]]]]

暂存文件存储路径,[level1 [level2 [level3 [level4]]]]为多级目录,会自动创建

例如:client_body_temp_path /var/tmp/nginx/client 1 2

 

5client_header_buffer_sizesize

正常接收用户请求报文的首部部分指定的内存空间的大小

 

MIME类型相关的配置:

1types {}

定义MIME types至文件的扩展名;

         type{

                   text/html.html

                   p_w_picpath/jpeg.jpg

}

2、  default_type MIME-TYPE;

指明默认的MIME类型

 

文件操作优化相关的配置:

1、   sendfile on|off 系统调用不经过用户态直接由内核封装后响应给请求方,启用能提搞性能

 

2、   aio on|off 异步I/O,启用性能更好

 

3 directio size|off 直接I/O

         是否使用O_DIRECT选项去请求读取文件;与sendfile功能互斥;

 

4 open_file_cachemax=N[inactive=time]|off 是否打开缓存大小

         nginx可以缓存以下三种信息:

         1)文件句柄、文件大小和最近一次修改时间

         2)打开目录的目录结构

         3)没有找到的或者没有权限操作的文件的相关信息

         max=N表示可以缓存的最大条目上限;一旦达到上限,则会使用LRU从缓存中删除最近最少使用的条目

         inactive=timeinactive指定的时长内没有被访问过的缓存条目将会被淘汰

 

5open_file_cache_errorson|off;

是否缓存在文件中缓存打开文件时出现找不到路径,没有权限等的错误信息

 

6open_file_cache_min_usestime

每隔多久检查一次缓存中缓存条目的有效性,默认60s

 

基于IP的访问控制:

httpserverlocation

使用allow deny来定义允许和限制

例如:在server中加一段

location /admin{

         root /nginx/htdocs;

         allow 192.168.0.0/24

         deny all;

}

基于用户的basic认证配置:

         auth_basic

         auth_basic_user_file

htpassword命令创建用户账号文件

举例:

创建保存用户账户密码的文件

cd /usr/loca/nginx/

htpasswd –c –m .htpasswd tom

 

location /admin{

         root /nginx/htdocs;

         auth_basic “admin area”;

         auth_basic_user_file/usr/local/nginx/.htpasswd;

}

基于gzip实现响应报文压缩:

ngx_http_gzip_module

gzip on|off 是否启用gzip功能

gzip_buffers number size 使用多大的空间来缓存压缩的结果

gzip_comp_level level  压缩级别

gzip_disable regex...; 对哪种内容不压缩,可以用正则匹配

gzip_min_length length; 文件最小是多少起始才启用压缩

gizp_http_version 1.0|1.1; gzip使用哪种版本协议

gzip_types mime-type ...;对哪种类型的文件进行压缩

gzip_vary on|off 启用或禁用在响应报文中插入一个首部“Vary:Accept-Encoding”

 

定制响应首部:

ngx_http_headers_module

         add_headername value [always];

         expirs24h; 指定有效期限

例如:

location / {

root /nginx/htdocs;

index index.html;

add_header x-header testheader;

}

 

查看首部时就会多一项

x-header:testheader

定制访问日志:

ngx_http_log_module

access_log 定义访问日志

log_fomat 定义日志格式

open_log_file_cache 开启日志文件缓存

 

定义合法引用:(可以防盗链)

ngx_http_referer_module

valid_referers none | blocked |server_names | string ...;

if ($invalid_referer){

         return403;

}

 

URL rewrite(URL重写):

ngx_http_rewrite_module

 

rewrite regex replacement [flag]

四种flag:

         last        服务器端匹配完规则从头再检测一遍,然后再响应给客户端

         break           服务器端匹配完规则不再从头检测,直接响应给客户端

         redirect     响应报文返回临时重定向状态码302

         permanent 响应报文返回永久重定向状态码301

if (condition) {

         ...

}

         比较表达式:=!=~~*!~-f!-f-d!-d-e!-e

 

return:

         returncode URL;

 

set $variable value

例如:

location / {

root /nginx/htdocs;

index index.html;

add_header x-header testheader;

rewrite ^/bbs/(.*) /forum/$1;

}

比如用户访问www.test.com/bbs/1.jpg会变成www.test.com/forum/1.jpg

状态页面

ngx_http_stub_status_module

location /status {

stub_status on;

}

 

Active connections:当前活动的连接数

accepts:已经接收的请求数

handled:已经处理的请求数

requests:总共处理的请求数

ssl功能

ngx_http_ssl_module

server {

listen        443 ssl;

server_name  localhost;

 

ssl_certificate  /etc/nginx/ssl/nginx.crt;服务器证书

ssl_certificate_key /etc/nginx/ssl/nginx.key; 服务器私钥

 

ssl_session_cache shared:SSL:1m;

ssl_session_timeout 5m;

 

ssl_ciphers HIGH: !aNULL: !MD5;

ssl_prefer_server_ciphers on;

 

location / {

root  /nginx/htdocs;

index  index.html;

}

}