一、nginx是什么

Nginx (engine x) 是一个高性能的HTTP和反向代理服

务器,也是一个IMAP/POP3/SMTP服务器。Nginx是

由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站

点(俄文:Рамблер)开发的,第一个公开版本0.1.0

发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性

、丰富的功能集、示例配置文件和低系统资源的消耗而

闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及

电子邮件(IMAP/POP3)代理服务器。其特点是占有

内存少,并发能力强,事实上nginx的并发能力确实在

同类型的网页服务器中表现较好,中国大陆使用nginx

网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

二、nginx特性

跨平台: Nginx 可以在大多数 Unix like OS编译运行, 而且也有Windows

的移植版本。 配置异常简单, 非常容易上手。 配置风格简单, 神一般的配

置易读性

高并发连接: 数据复制时, 官方测试能够支撑5万并发连接, 在实际生产环

境中跑到2~3万并发连接数.(这得益于Nginx使用了最新的epoll模型)通信

机制采用epoll模型, 支持更大的并发连接。

master/worker结构: 一个master进程, 生成一个或多个worker进程

功能模块化: nginx的内部结构是由核心部分和一系列的功能模块所组成

。 这样划分是为了使得每个模块的功能相对简单, 便于开发, 同时也便于

对系统进行功能扩展。

成本低廉: Nginx可实现负载均衡功能, 可以免费使用。 而购买F5 BIG-IP

、 NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币

内置的健康检查功能: 如果 Nginx Proxy 后端的某台 Web 服务器宕机了,

不会影响前端访问。

节省带宽: 有缓存模块, 支持 GZIP 压缩, 可实现浏览器本地缓存的

Header 头。

稳定性高: 用于反向代理(负载均衡) , 宕机的概率微乎其微

Nginx的特性Nginx的架构Nginx的模块流程图

Nginx模块主要有4种角色:

(1) core(核心模块):构建

nginx基础服务、管理其他模块。

(2) handlers(处理模块): 用于

处理HTTP请求,然后产生输出。

(3) load-balancers(负载均衡

模块):当有多于一台的后端备选

服务器时,选择一台转发HTTP请

求。

(4) filters(过滤模块): 过滤

handler产生的输出。21

Nginx安装方式

nginx安装常用两种方式,yum安装和源码包安装

yum 安装:通常是在线安装,好处是安装方式简单,不易出错;常

用的安装yum源为epel

源码包安装:是先将 nginx 的×××下来,在自己的系统里编译

生成可执行文件,然后执行,好处是因为是在自己的系统上编译的,

更符合自己系统的性能,也就是说在自己的系统上执行 nginx 服务

性能效率更好。(推荐,需要安装开发环境)

区别:路径和启动方式不同,支持的模块也不同

三、nginx的模块

Nginx模块主要有4种角色:

(1) core(核心模块):构建

nginx基础服务、管理其他模块。

(2) handlers(处理模块): 用于

处理HTTP请求,然后产生输出。

(3) load-balancers(负载均衡

模块):当有多于一台的后端备选

服务器时,选择一台转发HTTP请

求。

(4) filters(过滤模块): 过滤

handler产生的输出。

四、Nginx安装方式

nginx安装常用两种方式,yum安装和源码包安装

yum 安装:通常是在线安装,好处是安装方式简单,不易出错;常

用的安装yum源为epel

源码包安装:是先将 nginx 的×××下来,在自己的系统里编译

生成可执行文件,然后执行,好处是因为是在自己的系统上编译的,

更符合自己系统的性能,也就是说在自己的系统上执行 nginx 服务

性能效率更好。(推荐,需要安装开发环境)

区别:路径和启动方式不同,支持的模块也不同。

五、nginx的配置

主配置文件: nginx.conf

扩展相关配置文件: include conf.d/*.conf

协议配置: fastcgi, uwsgi, scgi等协议相关的配置文件

类型配置: mime.types: 支持的mime类型

六、主配置文件结构

main : #主配置段, 也即全局配置段; 正常运行必备配置

优化性能配置, 用于调试和定位的配置。

event {

...

}; 事件驱动相关的配置;

http {

...

}; http/https 协议相关的配置段;

七、Nginx配置文件讲解

nginx的主配置文件路径一般在

/etc/nginx/nginx.conf下(yum安装

) 或

者源码安装指定位置的conf目录

下, 如

/usr/local/nginx/conf/nginx.conf

配置文件主要配置设置:

main(全区设置)

http(协议配置)

upstream(负载均衡服务器设置)

和server、 location(URL匹配特定

位置设置)

1) 全局配置

#Nginx的worker进程运行用户以及用户组

user nobody nobody;

#Nginx开启的进程数

worker_processes 2;

worker_processes auto;

#也可以下参数指定了哪个cpu分配给哪个进程,

#worker_processes 4 #4核CPU

#worker_cpu_affinity 0001 0010 0100 1000

#定义全局错误日志定义类型, [debug|info|notice|warn|crit]

error_log logs/error.log info;

#指定进程ID存储文件位置

pid logs/nginx.pid;

2) 服务配置

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

http {

directive value;

...

server {

}s

erver {

}

...

}}必

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

server {

}

3)http段参数介绍

1. #文件扩展名与文件类型映射表

2. include mime.types;

3. #默认文件类型

4. default_type application/octet-stream;

6.#日志相关定义

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

8. # '$status $body_bytes_sent "$http_referer" '

9. # '"$http_user_agent" "$http_x_forwarded_for"';

10. #定义日志的格式。 后面定义要输出的内容。

11. #1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;

12. #2.$remote_user : 用来记录客户端用户名称;

13. #3.$time_local : 用来记录访问时间与时区;

14. #4.$request : 用来记录请求的url与http协议;

15. #5.$status : 用来记录请求状态;

16. #6.$body_bytes_sent : 记录发送给客户端文件主体内容大小;

17. #7.$http_referer : 用来记录从那个页面链接访问过来的;

18. #8.$http_user_agent : 记录客户端浏览器的相关信息

19. #连接日志的路径, 指定的日志格式放在最后。

20. #access_log logs/access.log main;

21. #只记录更为严重的错误日志, 减少IO压力

22. error_log logs/error.log crit;

http段参数介绍30

26. #默认编码

27. #charset utf-8;

28. #服务器名字的hash表大小

29. server_names_hash_bucket_size 128;

30. #客户端请求单个文件的最大字节数

31. client_max_body_size 8m;

32. #指定来自客户端请求头的hearerbuffer大小

33. client_header_buffer_size 32k;

34. #指定客户端请求中较大的消息头的缓存最大数量和大小。

35. large_client_header_buffers 4 64k;

36. #开启高效传输模式。

37. sendfile on;

38. #防止网络阻塞

39. tcp_nopush on;

40. tcp_nodelay on;

41. #客户端连接超时时间, 单位是秒

42. keepalive_timeout 60;

43. #客户端请求头读取超时时间

44. client_header_timeout 10;

45. #设置客户端请求主体读取超时时间

46. client_body_timeout 10;

47. #响应客户端超时时间

48. send_timeout 10;

50.#FastCGI相关参数是为了改善网站的性能: 减少资源占用, 提高访问速度。

51. fastcgi_connect_timeout 300;

52. fastcgi_send_timeout 300;

53. fastcgi_read_timeout 300;

54. fastcgi_buffer_size 64k;

55. fastcgi_buffers 4 64k;

56. fastcgi_busy_buffers_size 128k;

57. fastcgi_temp_file_write_size 128k;

59.#gzip模块设置

60. #开启gzip压缩输出

61. gzip on;

62. #最小压缩文件大小

63. gzip_min_length 1k;

64. #压缩缓冲区

65. gzip_buffers 4 16k;

66. #压缩版本(默认1.1, 前端如果是squid2.5请使用1.0)

67. gzip_http_version 1.0;

68. #压缩等级 1-9 等级越高, 压缩效果越好, 节约宽带, 但CPU消耗大

69. gzip_comp_level 2;

70. #压缩类型, 默认就已经包含text/html, 所以下面就不用再写了, 写上去也不会有问题, 但是会有一个warn。

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

72. #前端缓存服务器缓存经过压缩的页面

73. gzip_vary on;

4)虚拟主机相关介绍

虚拟主机相关的配置:

1、 server {}

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

2、 listen

listen address[:port];

listen port

default_server: 定义此server为http中默认的server; 如果所有的server中没有任何一个

listen使用此参数, 那么第一个server即为默认server;

3、 server_name [...];

server_name可以跟多个主机名, 名称中可以使用通配符和正则表达式(通常以~开头); 当

nginx收到一个请求时, 会取出其首部的server的值, 而后跟众server_name进行比较;

比较优先次序方式:

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

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

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

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

test.test.magedu.com

test.magedu.com/text

www.taobao.com

5)文件路径定义相关介绍

server段内

1、 root path

设置web资源路径; 用于指定请求的根文档目录;

location / {

root /www/htdocs;(本机的文件路径)

}lo

cation ^~ /p_w_picpaths/ {

root /web;

} 2

、 alias path

只能用于location中, 用于路径别名;

location / {

root /www/htdocs;

}lo

cation ^~ /p_w_picpaths/ {

alias /web/;

}

6)虚拟主机相关介绍

(1)location [ = | ~ | ~* | ^~ ] uri { ... }

(2)location @name { ... }

功能: 允许根据用户请求的URI来匹配指定的各location以进行访

问配置; 匹配到时, 将被location块中的配置所处理

=: 精确匹配;

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

~*: 正则表达式模式匹配, 匹配时忽略字符大小写

^~: URI前半部分匹配, 匹配时忽略字符大小写。 不检查正则表达

式 匹

配优先级:

= (大于) ^~ (大于) ~ (大于) 不带符号

7)文件路径定义相关介绍

(1) index file ...;

定义默认页面, 可参跟多个值;

(2) error_page code ... [=[response]] uri;

错误页重定向: 当对于某个请求返回错误时, 如果匹配上了

error_page指令中设定的code, 则重定向到新的URI中。

错误页面重定向;

例: error_page 404 /404.html;当用户请求一个不存在的资源

是, 会自动跳转到自定义的404.html页面。

注意跳转的状态码还是原来的状态码, 即使是跳转成功!