== Nginx介绍和安装 ==

Nginx是一个自由、开源、高性能及轻量级的HTTP服务器及反转代理服务器,

其性能与IMAP/POP3代理服务器相当。Nginx以其高性能、稳定、功能丰富、配置简单及占用系统资源少而著称。

Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx 作为 Web 服务器的网站也越来越多.

*基础功能

处理静态文件,索引文件以及自动索引;

反向代理加速(无缓存),简单的负载均衡和容错;

FastCGI,简单的负载均衡和容错;

模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;

SSL 和 TLS SNI 支持;

*优势

Nginx专为性能优化而开发,性能是其最重要的考量, 实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验, 有报告表明能支持高达 50,000 个并发连接数。

Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理服务器对外进行服务。

Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。

例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。

nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,就稳定性而言, nginx比lighthttpd更胜一筹。

Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。

Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。

*nginx的安装

开发稳定版: Nginx 0.8.X

当前稳定版: Nginx 0.7.X

历史稳定版: Nginx 0.6.X

)pcre安装,支持正则表达式  

http://www.pcre.org/  

# tar zxvf pcre-7.9.tar.gz  

# cd pcre-7.9  

#./configure  

# make && make install   

)openssl安装(可选),支持安全协议的站点  

http://www.openssl.org/  

# tar zxvf openssl-0.9.8l.tar.gz  

# cd openssl-0.9.8l  

#./config  

# make && make install   

)nginx的安装  

# tar zxvf nginx-0.7..tar.gz  

# cd nginx-0.7.  

配置安装和不安装组件:--with-MODULE_NAME or --without-MODULE_NAME  

# ./configure --prefix=/usr/local/nginx/nginx8011 --with-openssl=/usr/include/openssl --with-http_stub_status_module   

# make && make install  

目录结构:  

conf 配置文件  

html 静态页面  

logs 日志文件  

sbin 主程序  

)启动  

# /usr/local/nginx/nginx8011/sbin/nginx //启动  

启动参数:  

-c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。   

-t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。   

-v 显示 nginx 的版本。   

-V 显示 nginx 的版本,编译器版本和配置参数。   

不启动,仅测试配置文件:/usr/bin/nginx -t -c ~/mynginx.conf  

)配置自启动  

== 一个简单的配置文件 ==

#-----------------------------------基本模块  

# 使用的用户和组  

user  www www;  

# 指定工作进程数  

worker_processes  ;  

# 可以使用 [ debug | info | notice | warn | error | crit ]  参数  

#error_log  logs/error.log;  

#error_log  logs/error.log  notice;  

# 指定 pid 存放的路径  

#pid        logs/nginx.pid;  

#-----------------------------------事件模块   

events {  

#每个worker的最大连接数  

    worker_connections  ;  

}  

#-----------------------------------HTTP 模块   

http {  

#包含一个文件描述了:不同文件后缀对应的MIME,见案例分析  

    include       mime.types;  

#制定默认MIME类型为二进制字节流  

    default_type  application/octet-stream;  

#指令 access_log 指派路径、格式和缓存大小。  

    #access_log  off;  

#开启调用Linux的sendfile(),提供文件传输效率  

    sendfile        on;  

#是否允许使用socket的TCP_NOPUSH或TCP_CORK选项  

    #tcp_nopush     on;  

    #指定客户端连接保持活动的超时时间,在这个时间之后,服务器会关掉连接。  

    keepalive_timeout  ;  

#设置gzip,压缩文件  

    #gzip  on;  

#为后端服务器提供简单的负载均衡  

upstream apaches {  

server 127.0.0.1:;  

server 127.0.0.1:;  

}  

#配置一台虚拟机  

    server {  

        listen       ;  

        server_name  localhost;  

        location / {  

proxy_pass http://apaches;  

        }
}
}

== 模块介绍 ==

模块划分:

#Core 核心模块

#Events 事件模块

#HTTP HTTP模块

#Mail 邮件模块

*核心模块的常用组件

user   

语法: user user [group]   

缺省值: nobody nobody   

指定Nginx Worker进程运行用户,默认是nobody帐号。  

error_log   

语法: error_log file [ debug | info | notice | warn | error | crit ]   

缺省值: ${prefix}/logs/error.log   

制定错误日志的存放位置和级别。  

include   

语法: include file | *   

缺省值: none   

include 指令还支持像下面配置一样的全局包含的方法,例如包含一个目录下所有以".conf"结尾的文件: include vhosts/*.conf;  

pid   

语法: pid file   

进程id存储文件。可以使用 kill -HUP cat /var/log/nginx.pid/ 对Nginx进行配置文件重新加载。   

worker_processes   

语法: worker_processes number   

缺省值: 1   

指定工作进程数。nginx可以使用多个worker进程。  

*事件模块的常用组件

worker_connections   

语法:worker_connections number   

通过worker_connections和worker_proceses可以计算出maxclients: max_clients = worker_processes * worker_connections  

作为反向代理,max_clients为: max_clients = worker_processes * worker_connections/ ,因为浏览器访问时会通过连接池建立多个连接。  

use   

语法:use [ kqueue | rtsig | epoll | /dev/poll | select | poll | eventport ]   

如果在./configure的时候指定了不止一种事件模型,那么可以设置其中一个,以便告诉nginx使用哪种事件模型。默认情况下nginx会在./configure时找出最适合系统的事件模型。  

事件模型是指Nginx处理连接的方法。  

*HTTP模块的核心组件和变量

三个作用域:http, server, location   

server  

语法:server {...}   

作用域: http   

配置一台虚拟机。  

location   

语法: location [=|~|~*|^~] /uri/ { ... }   

作用域: server   

配置访问路径的处理方法。  

listen   

语法: listen address:port [ default [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ]   

默认值: listen    

作用域: server   

指定当前虚拟机的监听端口。  

alias   

语法: alias file-path|directory-path;   

作用域: location   

该指令设置指定location使用的路径.注意它跟 root 相似,但是不改变文件的根路径,仅仅是使用文件系统路径   

root   

语法: root path   

默认值:root html   

作用域:http, server, location  

alias指定的目录是准确的,root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。  

区别:  

location /abc/ {  

alias /home/html/abc/;  

}  

在这段配置下,http://test/abc/a.html就指定的是/home/html/abc/a.html。这段配置亦可改成  

location /abc/ {  

root /home/html/;  

}  

这样,nginx就会去找/home/html/目录下的abc目录了,得到的结果是相同的。  

HTTP模块的其他基本组件将结合案例介绍。  

变量:  

HTTP header 里边 特定HEADER的值,变量会转成小写,比如 $http_user_agent, $http_referer... header信息 "YOUR-STRANGE-HEADER: values" 能通过 $http_your_strange_header获得.   

$arg_PARAMETER   

$http_HEADER   

$query_string = $args   

*邮件模块的常用组件(略)

== 常用场景配置 ==

1.多台服务器配置负载均衡

http {  

    include       mime.types;  

    default_type  application/octet-stream;  

    sendfile        on;  

    keepalive_timeout  ;  

upstream allserver {  

#ip_hash;  

server 127.0.0.1: down;   

server 127.0.0.1: weight=;   

server 127.0.0.1:;   

server 127.0.0.1: backup;   

}
server { listen ; server_name localhost; location / { proxy_pass http://allserver; }
}
}

ip_hash; nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session

1.down  表示单前的 server 暂时不参与负载

2.weight  默认为 1.weight 越大,负载的权重就越大。

3.backup: 其它所有的非 backup 机器 down 或者忙的时候,请求 backup机器。所以这台机器压力会最轻。

2.通过手机客户端的头信息或者请求的参数转发到不用目录

http {  

    include       mime.types;  

    default_type  application/octet-stream;  

    sendfile        on;  

    keepalive_timeout  ;  

upstream apaches {  

server 127.0.0.1:;  

server 127.0.0.1:;  

}  

upstream tomcats {  

server 127.0.0.1:;  

server 127.0.0.1:;  

}
server { listen ; server_name localhost; location / { set $ismob ; # 注意if后的空格 if ( $http_chip ~* "(NOKIA3500)|(NOKIA3200)" ) { set $ismob ; proxy_pass http://apaches; } if ( $http_chip ~* "(NOKIA3500)|(NOKIA3200)" ) { set $ismob ; proxy_pass http://tomcats; } if ( $ismob = ) { root /usr/local/nginx/nginx8012/html; }
} location ~* /rewrite/testXID.jsp { if ( $arg_XID = "") { rewrite ^(.*)$ http://192.168.0.190:8084/testSID.jsp break; } }
} }

1、正则表达式匹配,其中:

= 完全相等;

~为区分大小写匹配;

~*为不区分大小写匹配;

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配。

2、文件及目录匹配,其中:

-f和!-f用来判断是否存在文件;

-d和!-d用来判断是否存在目录;

-e和!-e用来判断是否存在文件或目录;

-x和!-x用来判断文件是否可执行。

if (-d $request_filename){ ... }

哪些地方会出现正则表达式:

1.location ~* /.(gif|jpg|png|swf|flv)${...}

2.rewrite ^(.*)$ /nginx-ie/$1 break;

正则表达式举例:

1.多目录转成参数 abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

if ($host ~* (.*)/.domain/.com) {

set $sub_name $1;

rewrite ^/sort//(/d+)//?$ /index.php?act=sort&cid=$sub_name&id=$1 last;

}

2.目录对换 /123456/xxxx -> /xxxx?id=123456

rewrite ^/(/d+)/(.+)/ /$2?id=$1 last;

3.防盗链

http {  

    include       mime.types;  

    default_type  application/octet-stream;  

    sendfile        on;  

    keepalive_timeout  ;  

    server {  

        listen       ;  

        server_name  localhost;  

        location / {  

root html;  

        }  

        location ~* ^.+/.(gif|jpg|png|swf|flv|rar|zip)$ {   

valid_referers none blocked server_names http://localhost baidu.com;   

if ($invalid_referer) {   

 rewrite ^/ html/50x.html;   

}  

}
} }

4.访问控制:身份验证、限制IP

http {  

    include       mime.types;  

    default_type  application/octet-stream;  

    sendfile        on;  

    keepalive_timeout  ;  

upstream tomcats {  

server 127.0.0.1:;  

server 127.0.0.1:;  

}
server { listen ; server_name localhost; location / { allow 192.168.4.8; deny all; auth_basic "index"; auth_basic_user_file ../htpasswd; proxy_pass http://tomcats; }
}
}

cp /usr/local/apache/apache8001/bin/htpasswd /usr/local/bin/

/usr/local/bin/htpasswd -c htpasswd root

5.查看Nginx的运行状态

http {  

    include       mime.types;  

    default_type  application/octet-stream;  

    sendfile        on;  

    keepalive_timeout  ;  

upstream apaches {  

server 127.0.0.1:;  

server 127.0.0.1:;  

}  

upstream tomcats {  

server 127.0.0.1:;  

server 127.0.0.1:;  

}  

    server {  

        listen       ;  

        server_name  localhost;  

        location / {  

proxy_pass http://tomcats;  

        }  

        location /NginxStatus {  

stub_status on;  

access_log  off;  

auth_basic  "NginxStatus";  

auth_basic_user_file ../htpasswd;  

        }
}
}

== 进阶内容 ==

1.查看Nginx的运行状态

Active connections: 364

server accepts handled requests

5477919 5477919 17515830

Reading: 10 Writing: 26 Waiting: 328

意思如下:

active connections – 当前 Nginx 正处理的活动连接数。

serveraccepts handled requests -- 总共处理了 5477919 个连接 , 成功创建 5477919 次握手 (证明中间没有失败的 ), 总共处理了 17515830 个请求 ( 平均每次握手处理了 3.2 个数据请求 )。

reading -- nginx 读取到客户端的 Header 信息数。

writing -- nginx 返回给客户端的 Header 信息数。

waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

2.案例分析:

将web server由apache换为nginx后,却带来意想不到的问题.多个页面显示模块显示"正在加载中..."然后一直停顿,使用FireBug调试前端,XSL文件解析失败.但载入又是HTTP 200 的正常状态.

继续用FireBug调试,发现XSL文件下载时的HTTP响应头中,

Content-Type是oct/stream ,而在原来的apache中,是text/xml,于是修改/etc/nginx/mime.types文件.将XSL的扩展名加到xml组中.问题解决.

3. 通过系统的信号控制 Nginx

使用信号加载新的配置

平滑升级到新的二进制代码

4. 使用Nginx限制下载速率和并发数

limit_zone   limit_conn   limit_rate

5. 使用Nginx进行地址转发

rewrite

nginx rewrite中last和break的区别: http://blog.sina.com.cn/s/blog_4b01279a0100hd4c.html

6.Nginx Internals: Nginx源代码、内部机制的分析

http://blog.zhuzhaoyuan.com/2009/09/nginx-internals-slides-video/

PS.例子

 server {
listen ;
server_name wikibt.cn; # 这是HOST机器的外部域名,用地址也行
root /home/project/wikibtweb/;
index index.php index.htm index.html;
location ~ \.(htm|html)$ {
expires 24h;
} location /search/ {
index /html/search.html; # 这里是指向 gunicorn host 的服务地址
expires 24h;
} location /data/ {
proxy_pass http://172.16.246.184:8080; # 这里是指向 gunicorn host 的服务地址
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
} location / {
index html/index.html;
expires 24h;
}
}

== 参考资料 ==

Nginx中文文档:

http://wiki.nginx.org/NginxChs

服务器系统架构分析日志:

http://www.sudone.com/

使用 Nginx 提升网站访问速度:

http://www.ibm.com/developerworks/cn/web/wa-lo-nginx/

原文地址:http://blog.csdn.net/shootyou/article/details/6093562

其他文章推荐:https://www.linuxidc.com/Linux/2016-11/136885.htm

【转】【Nginx】Nginx 入门教程 + 常用配置解析的更多相关文章

  1. 最全面 Nginx 入门教程 + 常用配置解析

    转自 http://blog.csdn.net/shootyou/article/details/6093562 Nginx介绍和安装 一个简单的配置文件 模块介绍 常用场景配置 进阶内容 参考资料 ...

  2. Apache入门 篇(二)之apache 2.2.x常用配置解析

    一.httpd 2.2.x目录结构 Cnetos 6.10 YUM安装httpd 2.2.x # yum install -y httpd 程序环境 主配置文件: /etc/httpd/conf/ht ...

  3. Spring Cloud 入门教程 - 搭建配置中心服务

    简介 Spring Cloud 提供了一个部署微服务的平台,包括了微服务中常见的组件:配置中心服务, API网关,断路器,服务注册与发现,分布式追溯,OAuth2,消费者驱动合约等.我们不必先知道每个 ...

  4. nginx.conf常用配置解析

    一.全局配置 user username groupname 运行用户及用户组 worker_processes auto 启动进程,通常设置成和cpu数量相等的一个数值,默认为1.可以设置为auto ...

  5. 快速掌握Nginx(四) —— Nginx日志切片和常用配置总结

    1.Nginx日志管理 1.日志简单介绍 Nginx提供了日志记录的功能,日志文件在对我们管理网站十分有用,通过访问日志(access_log)我们可以获取请求来源.客户端信息.请求的资源等信息:通过 ...

  6. Nginx实战入门教程

    Nginx 简介 Nginx是一个高性能的http和反向代理服务器,它看起来好像不太符合英文单词的拼写习惯,因为Nginx是由名为 伊戈尔·赛索耶夫 的俄罗斯人开发的.Nginx主要特点为占用内存小, ...

  7. 最全的Django入门及常用配置

    Django 常用配置 Django 安装 pipx install django x 为python解释器版本2 or 3 如果你想安装指定版本的django,使用pip install djang ...

  8. CTF必备技能丨Linux Pwn入门教程——环境配置

    说在前面 这是一套Linux Pwn入门教程系列,作者依据Atum师傅在i春秋上的Pwn入门课程中的技术分类,并结合近几年赛事中出现的一些题目和文章整理出一份相对完整的Linux Pwn教程. 问:为 ...

  9. IntelliJ IDEA入门之常用配置以及问题解决(持续更新中)

    软件版本: IntelliJ IDEA 2019.1.1(Ultimate Edition) 运行环境: JDK1.8, Tomcat8.0, Maven3.6 我们在学习新的无论是jar包, 框架, ...

随机推荐

  1. HTML5学习笔记(二):HTML基础学习之一

    元素.属性和格式化 元素是指开始标签到结束标签之前的所有代码,如: <p>this is my page!</p> <!-- 下面的可以称为空元素 --> < ...

  2. 调试web api的工具 谷歌插件 Restlet

    介绍 http://chromecj.com/productivity/2017-08/789.html

  3. 每日英语:The Power of Parents Who Say 'No'

    I grew up in an affluent area. Most kids owned multiple Cabbage Patch dolls and Gear bags and pairs ...

  4. 关于SpringKafka消费者的几个监听器:[一次处理单条消息和一次处理一批消息]以及[自动提交offset和手动提交offset]

    自己在使用Spring Kafka 的消费者消费消息的时候的实践总结: 接口 KafkaDataListener 是spring-kafka提供的一个供消费者接受消息的顶层接口,也是一个空接口; pu ...

  5. MIME详解

    MIME详解 原文:http://blog.csdn.net/cxm_hwj/article/details/6690058 MIME,英文全称为“Multipurpose Internet Mail ...

  6. Python3.5爬取cbooo.cn数据并且同步到mysql中

    #!/usr/local/bin/python # -*- coding: utf-8 -*- # Python: 3.5 # Author: wucl(),zhenghai.zhang # Prog ...

  7. sql server 与oracle 中字段类型的对应

    SqlServer 2k转换为Oracle 10g 列名 SqlServer数据类型 SqlServer长度 Oracle数据类型 column1 ) column2 ) column3 ) colu ...

  8. 【Python】打印object对象

    print (object .__dict__) print (dir(object))

  9. Highcharts 多个Y轴动态刷新数据

    效果图: js代码: $(function() { $(document).ready(function() { Highcharts.setOptions({ global: { useUTC: f ...

  10. 3. DNN神经网络的正则化

    1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 3. DNN神经网络的正则化 1. 前言 和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考 ...