Nginx 简介
背景
- Nginx是由俄罗斯程序员Igor Sysoev编写,2004年10月作为一个试图回答公众发布C10K问题。其中 - C10k是同时管理10,000 个连接的挑战。Nginx 采用了事件驱动和异步架构,此设计使Nginx成为可扩展、高性能的服务器。
- 它是一个开源、轻量级和高性能的Web服务器,也用作HTTP、HTTPS、SMTP、IMAP、POP3协议的反向代理服务器,另一方面,它也用作IMAP、POP3 和IMAP的HTTP负载均衡器、HTTP缓存和电子邮件代理。
- 简而言之,我们可以说Nginx是一种用于处理并发请求的软件。
优点
- Nginx 最重要的功能是反向代理和负载均衡,反向代理将允许我们在端口80上托管多个域名,同时使用不同的语言编写后端服务,负载均衡可以把多个提供相同功能的后端服务配置成彼此冗余。
- Nginx 负责访问日志、黑名单、负载平衡和提供静态文件访问,后台Web服务则可专注于业务逻辑处理,Nginx是动静分离架构的入口程序。
- 支持高并发,内存占用小。
- 支持配置文件动态修改。
工作原理
nginx在启动后,会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程,worker进程以非root用户运行,可以在配置文件中配置运行worker进程的用户。
master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控 worker 进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
worker进程则是处理基本的网络事件。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求
目录结构
/usr/local/nginx
├── client_body_temp # POST大文件暂存目录
├── conf # Nginx所有配置文件的目录
│ ├── fastcgi.conf # fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件
│ ├── fastcgi_params # fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf #这是Nginx默认的主配置文件,日常使用和修改的文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html
│ └── index.html
├── logs # Nginx日志目录
│ ├── access.log
│ ├── error.log
│ └── nginx.pid
├── proxy_temp # 临时目录
├── sbin # Nginx 可执行文件目录
│ └── nginx
├── scgi_temp
└── uwsgi_temp
配置解析
Nginx主配置文件/usr/local/nginx/confnginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织,通常每一个区块以一对大括号{}来表示开始与结束。
- Main位于nginx.conf 配置文件的最高层,用来配置对整个 server 都有效的参数;
- Event位于Main下层,主要影响 Nginx 服务器与用户的网络连接;
- Http位于Event下层,其内部允许有多个 Server 层,用于对不同的网站做不同的配置;
- Server层里面允许有多个Location,用于对不同的路径进行不同模块的配置。
Main全局配置
主要会设置一些影响Nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。默认配置如下:
user root; #进程用户
worker_processes 1; #工作进程,配合和CPU个数保持一致
#error_log logs/error.log; #错误日志路径及级别
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #Nginx服务启动的pid
events 配置
主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个worker process可以同时支持的最大连接数等。默认配置如下:
events {
worker_connections 1024; #每个worker进程支持的最大连接数
#use epoll; #内核模型,select、poll、epol
}
http配置
主要包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。默认配置如下:
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; #访问日志
sendfile on; #优化静态资源
#tcp_nopush on; #nginx不要缓存数据,而是一段一段发送
#keepalive_timeout 0;
keepalive_timeout 65; #给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。
#gzip on; #压缩
}
Server配置
Server块也被叫做“虚拟主机”部分,它描述的是一组根据不同server_name指令逻辑分割的资源,这些虚拟服务器响应HTTP请求,因此都包含在http部分。最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。一个server块可以配置多个location 块。基本配置如下:
server {
listen 80; #监听端口,默认80
server_name localhost; #提供服务的域名或主机名
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #控制网站访问路径
root /root/www; #存放网站的路径
index index.html index.htm; #默认访问的首页
}
#error_page 404 /404.html; #错误页面
error_page 500 502 503 504 /50x.html; #定义请求错误,指定错误代码
location = /50x.html {
root html;
}
}
日志配置
日志使用用来进行数据统计、问题排错的重要手段。nginx日志相关涉及的配置有:
- access_log:访问日志
- log_format:日志格式
- error_log:错误日志
access_log配置
访问日志主要记录客户端的请求,客户端向Nginx服务器发起的每一次请求都记录在这里,基本语法如下:
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off; # 关闭访问日志
- path 指定日志的存放位置
- format 指定日志的格式。默认使用预定义的combined
- buffer 用来指定日志写入时的缓存大小。默认是64k
- gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1
- flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空
- if 条件判断,如果指定的条件计算为0或空字符串,那么该请求不会写入日志
- 特殊的值off,如果指定了该值,当前作用域下的所有的请求日志都被关闭
默认值: access_log logs/access.log combined
作用域:http、server、location
log_format配置
可以使用log_format来自定义日志格式,具体语法如下:
log_format name [escape=default|json] string ...;
- name 格式名称。在access_log指令中引用
- escape 设置变量中的字符编码方式是json还是default,默认是default
- string 要定义的日志格式内容,该参数可以有多个,参数中可以使用 一些变量
默认值: log_format combined “……”
作用域: http、server
error_log配置
该配置记录服务器和请求处理过程中的错误信息,语法如下:
rewrite_log on | off;
默认值:error_log logs/error.log error
作用域:main、http、mail、stream、server、location
示例
user root;
worker_processes 1;
error_log /var/logs/nginx/error.log;
error_log /var/logs/nginx/error.log notice;
error_log /var/logs/nginx/error.log info; #错误日志
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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 /var/logs/nginx/access.log main; #接受日志
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /root/www;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
效果: