Nginx服务应用

Nginx的优点和作用

Nginx是一款高性能的HTTP和反向代理的服务器软件,还是一个IMAP/POP3/SMTP(邮件)代理服务器!

Nginx在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP,Perl,python等,同时还支持正向和反向代理,虚拟主机,URL重写,压缩传输,SSL加密传输等。

Nginx和Apache的区别:最大的差别是Apache的处理速度很慢,而且占用很多内存资源,而Nginx正好相反。在功能实现上,Apache的所有模块都支持动,静态编译的,而Nginx都是静态编译的,Nginx对Fcgi的支持非常好;在处理连接方式上,Nginx支持epoll,Nginx的安装包非常小,只有几百KM。

Nginx采用分阶段资源分配技术,使得CPU和内存的占用率非常低,Nginx保持10000个没有活动的连接,只占用2.5MB内存,所一,类似DOS这样的攻击对Nginx没有任何作用。

Nginx采用内核poll模型,可以支持更多的并发连接,最大可以支持50000个并发连接数的响应,而且只占用很低的内存资源!

在高可用方面,Nginx支持热部署,启动速度特别迅速,因此可以不间断服务的情况下,对软件版本或配置进行升级,即使运行数月也无需重新启动,几乎可以做到7X24小时不间断的运行。

Nginx的工作模块和原理

Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

Nginx的模块从结构上分为核心模块,基础模块和第三方模块,

核心模块:HTTP模块,ECENT模块和MAIL模块等。

基础模块:HTTP Access模块,HTTP FastCGI模块,HTTP Proxy模块和HTTP Rewrite模块。

第三方模块:HTTP Upstream Request Hash模块,Notice模块和HTTP Access模块,用户根据自己的需要开发的模块都属于第三方模块。

Nginx的模块从功能上分为三类

Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handres处理器模块一般只能有一个。

Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后又Nginx输出。

Proxies(代理类模块)。此类模块式Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx的工作原理

HTTP发出请---Nginx内核-----选择一个Handlers处理器模块-----handlers(处理器模块)---生成内容---Filters(过滤器模块1)---处理内容---Filters(过滤器模块2)---Filters(过滤器模块N)---HTTP响应请求

工作方式:单工作进程和多工程进程两种模式。在单工作进程模式下,处主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进程包含多个线程。Nginx默认为单工作进程模式。

Nginx的模块是直接编译进去Nginx,因此属于静态编译方式。启动Nginx后,模块被自动加载!在解析配置文件时,Nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。

Nginx的安装

Nginx只能通过源码包编译安装,在安装Nginx之间,我们需要安装Nginx依赖的软件:gcc,openssl-devel,pcre,zlib-devel。

在默认情况下,通过编译安装的Nginx包含大部分可用模块,Nginx支持哪些模块,我们可以通过./configure –help查看nginx支持的所有模块

[root@localhost nginx-1.2.1]# ./configure --help

--prefix=PATH                      set installation prefix                                          #指定nginx的安装路径

--user=USER                        set non-privileged user for                              #指定用来运行nginx的用户

worker processes

--group=GROUP                      set non-privileged group for                         #指定运行nginx的组

worker processes

在安装时候,我们推荐开启NginxStatus和HTTPGzip模块,在编译安装的时候加上--with-http_stub_status_module和--with-http_gzip_static_module。

Nginx配置文件结构

Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的。每个block以“{}”来表示。block可以分为几次层次,整个配置文件中Main位于最高层,在Main下面有Events(项目),HTTP等层级,而在HTTP层中又包括Server层,即server block,server block又可以分为location(位置)层,并且一个server block中可以包含多个location block。

一个完整的Nginx服务的配置文件结构如图:

Nginx配置文件详解

nginx配置文件主要分成四个部分:main(全局配置),server(主机配置),upstream(负载均衡服务器设置)和location(URL匹配特定位置的设置)。main部分设置的命令将影响到其他所有设置;server部分的命令主要用于指定主机和端口;upstream命令主要用于负载均衡,设置一系列的后端服务器;location部分用于匹配网页位置。这四者之间的关系是:server继承main,location继承server,upstream既不会继承也不会被继承。

在这四个部分中,每个部分都包含若干命令,这些命令主要包含Nginx的主模块命令,事件模块命令,HTTP核心模块命令,同时每个部分还可以使用其他HTTP模块命令,例于:Http SSL模块,HttpGzip Static模块和Http Addition模块等。

user nobody nobody;

worker_processes  4;

error_log logs/error.log notice;

pid logs/nginx.pid;

worker_rlimit_nofile 65535;

events{

use epoll;

worker_connections 65535;

}

解释:

user是个主模块指令,指定Nginx worker进程运行用户以及用户组,默认的用户和用户组都是nobody运行。

worker_processes是个主模块指令,指定Nginx要开启的进程数,每个Nginx进程平均耗费10M-12M内存,根据经验,一般指定一个进程足够了,如果是多核CPU,建议指定和CPU的数量一样多的进程数即可。

error_log是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug,info,notice,warn,error,crit可供选择,其中debug输出日志最为详细,而crit输出日志最少。

pid:用来指定进程id的存储文件位置。

worker_rlimit_nofile:用于绑定worker进程和CPU,linux内核2.4以上可用。

events:设定Nginx的工作模式及连接数上限。其中参数“use”用来指定nginx的工作模式,nginx支持的工作模式有select,poll(选举),kqueue(队列),epoll,rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,对于Linux系统,epoll工作模式是首选。而参数”worker_connections”用于定义每个进程的最大连接数,默认是1024。所以,一个nginx服务的的最大客户端的连接数为:worker_processes*worker_connections.进程的最大连接数受linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit –n 65535”更改可以打开的最大文件的数量(临时有效,所以我们需要将命令加入到启动nginx用户的启动脚本中),worker_connections才会生效。

#对于root用户而言,我们直接修改ulimit=65535是没有一点问题的,但是普通用户就会报错Socket/File: Can’t open so many files,普通用户无权限修改这个值:所以我们应该最正确的修改方法是:

# vim /etc/security/limits.conf

#<domain>      <type>  <item>         <value>

*               soft    nofile  32768

*               hard    nofile  65536

在配置文件中将文件句柄限制修改为软:32768,硬:65536,配置在前面的domain,*号是代表所有,当然你也可以对单个用户进行设置。在这个当中,硬限制才是实际的显示,而软限制,只是warnning限制,只会做出警告,ulimit命令本身也有软硬之分,加-H就是硬,-S就是软。

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"';

access_log  logs/access.log  main;

client_max_body_size        20m;

client_header_buffer_size   32k;

large_client_header_buffers 4       32k;

sendfile        on;

tcp_nopush     on;

tcp_nodelay    on;

keepalive_timeout  65;

client_header_timeout 10;

client_body_timeout 10;

send_timeout        10;

释:

include:主模块命令,实现对配置文件所包含文件的设定,可以减少主配置文件的复杂度,类似于Apache中的include方法。

default_type:属于HTTP核心模块命令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例于,在没配置PHP环境时,Nginx是不会解析的,用浏览器访问PHP文件时会出现下载窗口。

log_format:用于指定nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log命令中引用。

client_max_body_size:用来设置允许客户端请求的最大的单个文件字节数。

client_header_buffer_size:用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1KB的缓冲区大小已经够了,如果自定义了消息头或有更大的cookie,可以增加缓冲区大小。这里设置为32KB。

large_client_header_buffer:用来指定客户端请求中较大的消息头的缓存最大数量和大小,“4”为个数,“128K”为大小,最大缓存量为4个128KB。

sendfile:用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个命令设置为“on”用于防止网络阻塞。

keepalive_timeout:设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。

client_header_tomeout:设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误。

client_body_timeout:设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60。

send_timeout:设定响应客户端的超时时间。这个超时仅限于两个链接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。

httpgzip模块相关属性设置:

gzip  on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

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

gzip_vary on;

释:

gzip:用于设置开启或者关闭gzip模块。开启gzip压缩,实时压缩输出的数据流。

gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从header(数据头)头的Content-length(内容长度)中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1KB的字节数,小于1KB可能会越压越大。

gzip_buffers:表示申请4个单位为16kb的内存作为压缩结果流缓存。默认是申请与原始数据大小相同的内存空间来存储GZIP压缩结果。

gzip_http_version:用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。

gzip_comp_level:用于指定gzip压缩比,1表示压缩比最小,处理速度最快;9表示压缩比最大,传输速度快,但处理速度最慢,也比较消耗CPU资源。

gzip_types:用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩。

gzip_vary:让前端的缓存服务器缓存经过gzip压缩的页面,例于用Squid(代理和缓存服务器)缓存经过Nginx压缩的数据。

虚拟主机的配置:

server {

listen       80;

server_name  www.gxl.com;

index   index.html index.htm index.jsp;

root    html;

charset gb2312;

access_log  logs/host.access.log  main;

释:

建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过include(包含)命令包含进来,这样更利于维护和管理。配置虚拟主机代码中每个参数的含义。

server:定义虚拟主机开始的关键字。

listen:用于指定虚拟主机的服务端口。

server_name:用来指定ip地址和域名,多个域名之间用空格分开。

index:用于设定访问的默认首页地址。

root:用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。

charset:用于设置网页的默认编码格式。

assess_log:用来指定此虚拟主机的访问日志存放路径,最后的man用于指定访问日志的输出格式。

URL地址匹配设置:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {                                                        #.*\.gif     就是匹配当前目录下所有*.gif文件。         .        当前目录         *       通配符     \.      转义符,使后面这个点没有特需含义

root    html;

expires 30d;

}

释(文件):

URL地址匹配是nginx配置中最灵活的部分。通过location关键字定义了地址匹配的开始。location支持正则表达式,也支持条件判断匹配。用户可以通过location命令实现nginx对动态,静态网页进行过滤处理。

在上面这段location代码中,所有以扩展名以.gif,.jpg…..等等结尾的静态文件都交给Nginx处理,而expires用来指定静态文件的过期时间,这里是30天。

location ~ ^/(upload|html)      {

root    html;

expires 30d;

}

释(目录):

这段代码是将upload和html目录下的所有文件都交给nginx处理,而这两个目录实在html目录下的。

location ~ .*.jsp$      {

index index.jsp;

proxy_pass      http://locahost:8080;

}

释:

这段代码中,通过location关键字将所有以.jsp关键字为后缀的文件都交给本机的8080端口处理。这样就可以实现nginx的动静态分离,而为什么是8080端口勒?因为一般我们都需要搭建tomcat服务,而8080端口就是tomcat服务的端口。

Nginx运行状态,StubStatus模块能够获取nginx自上次启动以来的工作状态:

location        /NginxStatus {

stub_status     on;

access_log       logs/NginxStatus.log;

auth_basic      "NginxStatus";

auth_basic_user_file    ../htpsswd;

}

释:

stub_status:是否启用StubStatus的工作状态统计功能

access_log:用来指定StubStatus模块的访问日志功能

auth_basic:是nginx的一种认证机制

auth_basic_user_file:用来指定认证的密码文件

由于nginx的auth_basic认证采用的是与Apache兼容的密码文件,因此需要用htpasswd命令来生成密码文件:

htpasswd -c /usr/local/nginx/conf/htpasswd admin

设置user成功以后,我们重启一下服务,然后在浏览器中http://IP/NginxStatus访问

Active connections:表示当前活跃连接数

第三行的上那个数字分别表示:当前总共处理连接的次数;成功创建握手次数;处理请求次数

reading:表示nginx读取到客户端header(信息头)信息数           writing:表示nginx返回给客户端header信息数     waiting:表示nginx已处理完,正在等候下一次请求命令时的驻留连接数。

error_page   500 502 503 504  /50x.html;

location = /50x.html {

root   html;

}

释:

通过page命令可以定制各种错误信息的返回页面。在默认情况下,nginx会在主目录html目录中查找指定的返回页面。需要特别注意的是,这些错误信息的返回页面信息的大小一定要超过512KB,否则会被IE替换成自己默认的。

1.Nginx服务应用的更多相关文章

  1. 安装Nginx服务

    Nginx最大特点: 静态小文件(1M),支持高并发,同时占用系统资源很少.3W并发,10个进程,内存150M. Nginx特点: 1.配置简单,灵活,轻量. 2.高并发(静态小文件),静态几万的并发 ...

  2. nginx服务傻瓜搭建

    nginx服务傻瓜搭建 安装步骤: 一.先准备好相关源码包和程序包,如下图 所有包都在云服务器的/src目录下. 二.安装 1.安装nginx服务器,支持vod stream.fileupload c ...

  3. Nginx服务状态监控

    在Nginx的插件模块中有一个模块stub_status可以监控Nginx的一些状态信息,默认安装可能没有这个模块,手动编译的时候加一下即可. 1. 模块安装 先使用命令查看是否已经安装这个模块: [ ...

  4. Nginx服务安装配置

    1.Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器,由俄罗斯人开发的,第一个版本发布于2004年10月4日.Nginx由于出色的性能,在世界范围内受到了越来越多人的关注,其特点是占有 ...

  5. 9. nginx服务实验笔记

    LNMP安装与配置   Nginx与apache.lighttp性能综合对比,如下图:     一.系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu系统 需要3GB以上硬盘 ...

  6. Python 监控nginx服务是否正常

    Python 监控nginx服务是否正常 #!/usr/bin/env python import os, sys, time from time import strftime while True ...

  7. (转)不停止Nginx服务的情况下平滑变更Nginx配置

    在不停止Nginx服务的情况下平滑变更Nginx配置 1.修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确: /u ...

  8. Nginx系列~Nginx服务启动不了

    Nginx服务有时起动不了了,原因是80端口为其它应用程序占用了,这时,我们需要查看是哪个程序占用了它,可能是IIS的某个站点,或者Tomat,Apache等,都有可能,所以,我们需要查看一下电脑80 ...

  9. Nginx高性能服务器安装、配置、运维 (4) —— Nginx服务、架构及其信号

    五.Nginx服务.架构及其信号 (1)Nginx服务的查看 1.netstat -antp 查看Nginx是否在80端口运行: 2.ps aux|grep nginx 查看nginx相关进程: 发现 ...

  10. Nginx+Keepalived主备切换(包含nginx服务停止)

    原文地址:http://blog.sina.com.cn/s/blog_79ac6aa80101bmed.html Nginx+Keepalived主备切换(包含nginx服务停止) 环境: VM中4 ...

随机推荐

  1. JS 中对变量类型的五种判断方法

    5种基本数据类型:undefined.null.boolean.unmber.string 复杂数据类型:object. object:array.function.date等 方法一:使用typeo ...

  2. NGUI_概述

    序言:这是张三疯第一次开始NGUI插件的学习,刚开始学习,肯定有很多漏洞,后期会及时的补上的. 希望大家可以见谅,希望大佬多多指教. 一.什么是NGUI: NGUI是严格遵循KISS原则并用C#编写的 ...

  3. linux apt-cache使用方法

    apt-cache是linux下的一个apt软件包管理工具,它可查询apt的二进制软件包缓存文件.APT包管理的大多数信息查询功能都可以由apt-cache命令实现,通过apt-cache命令配合不同 ...

  4. git以及github的初级入门(一)

    本身学习git的操作是没什么兴趣的,毕竟原本是win平台学的java开发,git下那么多复制的命令行操作确实比较让人头疼,直到昨天我打开计算机的时候,我放置项目的E盘,以及F盘,G盘盘符都不见了!!我 ...

  5. Android 7.1 屏幕旋转流程分析

    Android 7.1   屏幕旋转流程分析 一.概述 Android屏幕的旋转在framework主要涉及到三个类,结构如图 PhoneWindowManager:为屏幕的横竖屏转换的管理类. Wi ...

  6. Dos命令的巧用

    豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落,然而,真正有价值的东西不会轻易退出历史的舞台.很多人都已经习惯于 Windows的图形化用户界面,熟不知古老的DOS命令却可以轻易的办到很多事 ...

  7. Chrome浏览器调试技巧

    本文主要讲解针对chrome浏览器的调试方案,对于其他浏览器其实大同小异. 先来入门一点的 DOM元素调试 看上图: 以上图表明的1,2,3,4,5标记说明: 1,为移动设备模拟器,chorme现在是 ...

  8. Python源代码剖析笔记3-Python运行原理初探

    Python源代码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源代码剖析笔记,然而慢慢觉得没有从一个宏观 ...

  9. 新ITC提交APP常见问题与解决方法(Icon Alpha,Build version,AppIcon120x120)(2014-11-17)

    1)ICON无法上传.提示图片透明(有Alpha通道) 苹果如今不接受png里的Alpha了.提交的图标带有Alpha通道就提示: watermark/2/text/aHR0cDovL2Jsb2cuY ...

  10. ResourceBundle读取文件学习

    开发中,我们经常需要读取本地文件(properties文件),这样的好处是文件是动态的,可配置的.这时候我们就需要用到ResourceBundle这个类. 这个类属于java.util.*. 这个类的 ...