一、nginx结构
Nginx (engine x)是一个高性能的 HTTP和反向代理 web服务器,同时也提供了 IMAP/POP3/SMTP服务。
1.工作架构
nginx有两种工作模式:master-worker模式和单进程模式。在 master-worker模式下,有一个 master进程和至少一个的 worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。
1>master-worker
该模式下,nginx启动成功后,会有一个 master进程和至少一个的 worker进程。master进程负责处理系统信号,加载配置,管理 worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是 worker进程。生产环境下一般使用
优点:
1.稳定性高,只要还有worker进程存活,就能够提供服务,并且一个 worker进程挂掉 master进程会立即启动一个新的 worker进程,保证worker进程数量不变,降低服务中断的概率。
2.配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
3.处理信号:配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)
2>单进程模式
单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用 gdb等工具进行调试。该模式不支持 nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。
2.nginx进程结构
3.配置文件结构
1>全局配置段
#user nobody; #程序运行的用户和组
worker_processes 1; #启动进程,指定 nginx启动的工作进程数量,建议按照 cpu数目来指定,一般等于 cpu核心数目
#error_log logs/error.log; #定义错误日志
#error_log logs/error.log notice; #定义错误日志的级别
#error_log logs/error.log info;
#pid logs/nginx.pid; #程序Pid存放位置
events {
use epoll;
accept_mutex on; #同一时间的多个请求由worker进程轮流处理,而防止被同时唤醒多个worker,默认设置成off,新请求会唤醒所有的worker进程,此过程也被成为“惊群”,建议设置成on;
multi_accept on ; #on时nginx服务器的每个工作进程可以同时接受多个网络请求,如果设置成off,则每次只能接收一个请求,建议打开
worker_connections 1024; #单个工作进程的最大连接数,total_processes=worker_processes * worker_connections
}
2>http段
#http段
http {
include mime.types; #文件的扩展名映射表
default_type application/octet-stream; #mime扩展支持的格式,代表.*
#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 和tcp_nodelay on 两个指令设置为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率
#tcp_nopush on;
#keepalive_timeout 0; #会话保持的超时时间,单位为s,0代表不断开。
keepalive_timeout 65;
#gzip on; #压缩
3>server段
#server段
server { #服务配置部分
listen 80; #监听的端口
server_name localhost; #服务器域名,可以有多个,用空格分来
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #网站的根目录
root html; #相对路径的根目录
index index.html index.htm index.php;
} #默认首页的类型
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ { #反向代理
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ { #反向代理到php-fpm来处理php的页面
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
}
4.nginx的模块
nginx是由内核和模块构成的。nginx的模块从结构上分为三个模块,分别为:
1、核心模块:HTTP模块、EVENT模块和MAIL模块。
2、基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块。
3、第三方模块:HTTP Upstream Request Hash模块、Notice模块、HTTP Access Key模块和Limit_req模块等。
从功能上分,nginx又可以分为三个模块
1、处理器模块(Handlers)。 此模块直接处理请求,并进行输出内容和修改headers信息等操作,处理器模块一般只能有1个。
2、过滤器模块(Filters)。 此模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
3、代理类模块(Proxies)。 此类模块主要与一些后端服务FastCGI等进行交互,实现服务代理和负载均衡等功能。
nginx的常用模块
模块名称 | 功能 |
---|---|
rewrite | 重写 URL |
proxy | 代理 |
ssl | SSL 加密 |
worker_processes | 进程数 |
event | 事件驱动模型 |
resize_file | 文件大小限制 |
http_access | HTTP 访问权限控制 |
http_limit_methods | HTTP 方法限制 |
http_limit_conn | HTTP 连接限制 |
http_limit_req_zone | HTTP 请求配额 zone |
http_auth_login | HTTP 认证登录 |
http_auth_pass | HTTP 认证授权 |
smtp | SMTP 代理 |
imap | IMAP 代理 |
http_autoindex | HTTP 自动展开目录 |
x_forwarded_for | 代理 IP 追踪 |
set_real_ip_from | 代理 IP 白名单 |
real_ip_header | 代理 IP 响应头 |
x_forwarded_proto | 代理协议追踪 |
x_forwarded_端口 | 代理端口追踪 |
模块名称 | 模块作用 |
---|---|
ngx_http_access_module | 四层基于 IP 的访问控制,可以通过匹配客户端源 IP 地址进行限制 |
ngx_http_auth_basic_module | 状态页,使用 basic 机制进行用户认证,在编译安装 nginx 的时候需要添加编译参数--withhttp_stub_status_module,否则配置完成之后监测会是提示语法错误 |
ngx_http_stub_status_module | 状态统计模块 |
ngx_http_gzip_module | 文件的压缩功能 |
ngx_http_gzip_static_module | 静态压缩模块 |
ngx_http_ssl_module | nginx 的 https 功能 |
ngx_http_rewrite_module | 重定向模块,解析和处理 rewrite 请求 |
ngx_http_referer_module | 防盗链功能,基于访问安全考虑 |
ngx_http_proxy_module | 将客户端的请求以 http 协议转发至指定服务器进行处理 |
ngx_stream_proxy_module | 将客户端的请求以 tcp 协议转发至指定服务器处理 |
ngx_http_fastcgi_module | 将客户端对 php 的请求以 fastcgi 协议转发至指定服务器助理 |
ngx_http_uwsgi_module | 将客户端对 Python 的请求以 uwsgi 协议转发至指定服务器处理 |
ngx_http_headers_module | 可以实现对头部报文添加指定的 key 与值 |
ngx_http_upstream_module | 负载均衡模块,提供服务器分组转发、权重分配、状态监测、调度算法等高级功能 |
ngx_stream_upstream_module | 后端服务器分组转发、权重分配、状态监测、调度算法等高级功能 |
ngx_http_fastcgi_module | 实现通过 fastcgi 协议将指定的客户端请求转发至 php-fpm 处理 |
ngx_http_flv_module | 为 flv 伪流媒体服务端提供支持 |