Nginx深入浅出
一级标题为思维导图的链接 :)
1. Nginx简介
1.1 nginx概述
- 说明(C10K)
- 程序架构(master/worker)
- nginx的特性
- 文件并发处理(异步、事件驱动)epoll / select
- 文件IO(高级IO,异步 mmap)
- 模块分类
- 核心模块(core module)
- 标准模块(HTTP modules、Stream modules、Mail modules)
- 第三方模块(3rd party modules)
- nginx的功能
- 静态web资源服务器
- 结合FastCGI、uwSGI等协议反代动态资源请求
- http/https协议的反向代理
- tcp/udp协议的请求转发
- imap4/pop3协议的反向代理
1.2 nginx的安装及程序环境
- 安装
- yum安装(添加nginx官方的yum仓库)
- 编译安装(参数见 nginx -V)
- 程序结构
- 主程序文件:/usr/sbin/nginx
- Unit File:nginx.service
- 配置文件:/etc/nginx/nginx.conf、/etc/nginx/conf.d/*.conf
- mime.type:支持的mime类型
- Nginx工作原理图示
1.3 零复制机制&五种IO模型
1.3.1 零复制机制
- zero-copy:mmap()
- 将文件直接映射到用户程序的内存中
- 这段内存空间可以用作进程间的共享内存空间,内核也可以直接操作这段空间
- zero-copy:sendfile()
- 借助文件描述符来实现数据拷贝
- 将文件描述符in_fd的数据拷贝给文件描述符out_fd
- zero-copy:splice()
- 在两个文件描述符之间移动数据,且其中一个文件描述符必须是管道描述符
- zero-copy:tee()
- 在两个管道描述符之间复制数据
写时复制(copy-on-write),COW
1.3.2 五种IO模型
- Blocking I/O:阻塞的IO
- Non-Blocking I/O:非阻塞的IO
- Multiplexing I/O:IO多路复用
- Singal-driven I/O:信号驱动IO
- Asynchronous I/O:异步IO
1.4 nginx的基本配置
- 主配置文件
- nginx命令
- -t
- -c
- -s
- 主配置文件结构
2. Nginx配置详解
2.1 main配置段详解
2.1.1 正常运行的必备配置
- user user [group];
- pid /path/to/pid_file;
- include file | mask;
- load_module file;
2.1.2 性能相关
- worker_processes number | auto;
- worker_cpu_affinity cpumask...
- worker_priority number;
- worker_rlimit_nofile number;
2.1.3 调试、定位
- daemon on | off;
- master_process on | off;
- error_log file [level];
2.1.4 事件驱动相关
- worker_connection number;
- use epoll;
- accept_mutex on | off;
- multi_accept off;
2.2 http配置段详解
2.2.1 与套接字相关的配置
- server{...}
- listen address[:port]
- server_name name;
- tcp_nodelay on | off;
- tcp_nopush on | off;
- sendfile on | off;
2.2.2 定义路径相关的配置
- root path;
- location [ = | ^~ | ~ | ~* ] URI { ... }
- alias path;
- index file;
- error_page code ... [=[response]] URI
2.2.3 定义客户端请求的相关配置
- keepalive_timeout timeout [header_timeout];
- keepalive_requests number;
- keepalive_disable none | browser ...;
- send_timeout time;
- client_body_buffer_size size;
- client_body_temp_path path [level1 [level2 [level3]]];
2.2.4 对客户端进行限制的相关配置
- limit_rate rate;
- limit_except method ... {}
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
2.2.5 文件操作优化的配置
- aio on | off;
- open_file_cache on | off;
- open_file_cache_valid time;
- open_file_cache_min_uses number;
- open_file_cache_errors on | off;
2.2.6 add_header添加响应首部字段
server {
add_header RealPath $realpath_root;
}
2.3 各种常用模块提供的功能
2.3.1 ngx_http_access_module
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.0.0.0/16;
deny all;
}
2.3.2 ngx_http_auth_basic_module
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
2.3.3 ngx_http_stub_status_module
location /basic_status {
stub_status;
}
对于回显信息的说明:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
# Active connections: 活动状态的连接数;
# accepts:已经接受的客户端请求的总数;
# handled:已经处理完成的客户端请求的总数;
# requests:客户端发来的总的请求数;
# Reading:处于读取客户端请求报文首部的连接的连接数;
# Writing:处于向客户端发送响应报文过程中的连接数;
# Waiting:处于等待客户端发出请求的空闲连接数;
2.3.4 ngx_http_log_module
- log_format name string ...;
- access_log path [ format [buffer=size] [gzip[=level]] [flush=time] [if=condition] ];
- open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
2.3.5 ngx_http_gzip_module
- gzip on | off;
- gzip_comp_level level;
- gzip_disable regex ... ;
- gzip_buffers number size;
- gzip_buffers 32 4k;
- gzip_buffers 16 8k;
- gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …;
- gzip_types mime-type ...;
gzip on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css application/javascript;
2.3.6 ngx_http_ssl_module
- ssl on | off;
- ssl_certificate file;
- ssl_certificate_key file;
- ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
- ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
- ssl_session_cache shared:sslcache:20m;
server {
listen 443 ssl;
server_name www.hgzerowzh.com;
root /vhosts/ssl/htdocs;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2;
ssl_session_cache shared:sslcache:20m;
}
2.3.7 ngx_http_referer_module
- valid_referers none | blocked | server_names | string …;
valid_referers none blocked server_names *.hgzerowzh.com hgzerowzh.* ~\.hgzero\.;
if($invalid_referer) {
return http://www.hgzerowzh.com/invalid.jpg;
}
2.4 URL重写(rewrite)
2.4.1 ngx_http_rewrite_module
- rewrite regex replacement [flag]
- flag:last、break、redirect、permanent
- return code [URL]
- rewrite_log on | off;
- if (condition) {...}
- set $variable value
# 当使用IE浏览器访问时,重定向到/msie/目录下的对应文件
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
# 当http请求的方法为POST,则直接返回405状态码,即Method not Allowed
if ($request_method = POST) {
return 405;
}
# 当请求的资源文件不存在,则直接退出当前匹配,并代理至本机,这种情况下由本机来提供服务,如提供错误页面
if (!-f $request_filename) {
break;
proxy_pass http://127.0.0.1;
}
# 当访问的是hgzerowzh.com下任意主机,则重定向到www.hgzerowzh.com主机下的对应目录
if ($http_host ~* "^(.*)\.hgzerowzh\.com$") {
set $domain $1;
rewrite ^(.*) http://www.hgzerowzh.com/$domain/ break;
}
# 最后一种URL重写为一个新的主机名站点,但使用URL重写的效率比较低下,远不如直接为此站点独立定义一个虚拟主机
3. nginx配置文件概览
user nginx; # 定义worker进程的用户和用户组
pid /var/run/nginx.pid; # 使用的pid文件
load_module /path/to/file; # 加载的模块
include /path/to/file; # 导入的配置文件
worker_processes auto; # worker进程数
worker_cpu_affinity auto; # worker进程和cpu绑定
worker_priority 0; # 定义worker进程的nice值
worker_rlimit_nofile 3600; # 所有的worker进程能够打开的文件数量上限
daemon on; # 是否守护进程模式
master_process on; # 是否启用master/worker模式
error_log /var/log/nginx/error.log warn; # 错误日志的记录位置及级别
events {
worker_connections 1024; # 每个worker的最大并发连接数
use epoll; # 使用的并发连接处理方法
accept_mutex on; # 是否启用互斥锁,On意味着由各worker轮流处理新请求,
# Off意味着每个新请求的到达都会通知所有的worker进程
}
http {
tcp_nodelay on; # 在keepalived模式下的连接,多个报文不要合并一起发
tcp_nopush on; # 开启sendfile时,让数据包挤满到一定程度才发送,挤满之前被阻塞
sendfile on; # 启用零拷贝模式
keepalive_timeout 65; # 保持连接的超时时间,设置0为不开启
keepalive_requests 100; # 一次长连接的最大资源请求数
keepalive_disable none; # 指定对哪种浏览器禁用长连接
send_timeout time; # 向客户端发送响应报文的超时时间,
# 指两次写操作之间的间隔时间
client_body_buffer_size 16k; # 指定接收客户端请求报文的body部分的缓冲区大小,
# 默认为16k,超出此大小就放到下面的临时路径中
client_body_temp_path /var/tmp/client_body 1 2 2;
# 设定用于存储客户端请求报文body部分的临时路径和子目录结构和数量
aio on; # 是否开启aio功能
open_file_cache max=2000 inactive=10; # 缓存打开文件的元数据
open_file_cache_valid 60s; # 缓存有效性的检查频率,默认60s
open_file_cache_min_uses 3; # 指定在活动有效期内,最小的命中次数
open_file_cache_errors on; # 是否缓存查找时发生错误的文件一类的信息
limit_rate 0; # 限制客户端的传输速率(bytes/second)
limit_except GET { # 限制使用除了GET请求之外的方法时,允许的客户端
allow 192.168.1.0/24;
deny all;
}
gzip on; # 启用gzip压缩响应报文
gzip_comp_level 6; # 指定压缩比
gzip_disable none; # 对于指定的浏览器不启用压缩功能
gzip_min_length 64; # 启用压缩功能的响应报文大小阈值
gzip_buffers 32 4k; # 支持实现压缩功能时为其配置的缓冲区数量及每个缓冲区的大小
gzip_proxied any; # nginx作为代理服务器时,在何种条件下启用压缩功能
# gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
gzip_types mime-type; # 压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能
# 实现防盗链功能
valid_refers none blocked server_names *.hgzero.com hgzero.* ~\.hgzero\.; # 设置合法的referer来源
# valid_refers none | blocked | server_names | string ...; # none表示没有referer,blocked表示referer值为空
if($invalid_referer){
return http://www.hgzero.com;
}
server { # 定义一个虚拟主机,要注意虚拟主机的匹配规则
# listen IP:PORT [default_server] [ssl] [http2|spdy] [backlog=NUM] [rcvbuf=size] [sndbuf=size];
listen 80;
# 定义主机名加域名,即网站地址,注意这里的匹配机制顺序:精确匹配>左侧*通配符>右侧*通配符>正则匹配
server_name www.hgzero.com *.hgzero.com hgzero.* ~^www\d+.hgzero\.com$;
# 在响应首部中添加字段,这里添加了一个RealPath字段,值为变量realpath_root的值
add_header RealPath $realpath_root;
# 使用ssl(要在监听ip和端口后面加上ssl字段)
ssl on;
ssl_certificate cert.pem; # ssl证书的位置
ssl_certificate_key cert.key; # 与证书匹配的私钥文件
ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2; # 指定ssl协议版本,默认为tlsv1 tlsv1.1 tlsv1.2
# ssl_protocols [SSLv2][SSLv3][TLSv1][TLSv1.1][TLSv1.2];
ssl_session_cache shared:sslcache:20m; # 设置ssl的session缓存
# ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
ssl_session_timeout 30s; # 设置客户端一侧的连接可以复用ssl session cache中缓存的ssl参数的有效时长
#############################
location [ = | ^~ | ~ | ~* ] uri { # 要特别注意location容器的匹配规则
root /data/one/;
}
#############################
location /images/ {
root /data/hgzero/; # 站定根目录,相当于uri中左边的/
# alias /data/hgzero/; # 定义站点别名,相当于uri中右边的/
index index.html index.php; # 站点主页文件
}
# 自定义错误页面
error_page 404 /notfound.html;
location = /notfound.html {
root /data/nginx/error_pages;
}
# 实现用户访问控制
location /admin/ {
alias /webapps/app1/data/;
auth_basic "Admin Area"; # 提示的字符串
auth_basic_user_file /etc/nginx/.ngxpasswd; # 用户名及密码认证文件,可以用htpasswd生成
}
# 获取nginx状态信息,这里最好要定义访问控制权限
location /basic_status {
stub_status;
}
# 指定日志记录的格式
log_format main '$remote_addr' - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for"'';
# $remote_addr:客户端地址,如果有代理服务器,则要使用$http_x_forwarded_for
# $remote_user:远程客户端用户名称
# $time_local:记录访问时间和时区信息
# $request:记录用户访问时的url和http协议信息,如:"GET /favicon.ico HTTP/1.1"
# $status:记录客户端请求时返回的状态码
# $body_bytes_sent:记录服务器响应给客户端的主体大小
# $http_referer:记录此次请求是从哪个链接过来的
# $http_user_agent:记录客户端的浏览器信息
# $http_x_forwarded_for:记录每一级代理的信息
access_log /spool/logs/nginx-access.log main; # 指定日志文件的存放位置
# access_log /spool/logs/nginx-access.log gzip buffer=32k;
open_log_file_cache max=2000; # 缓存各日志文件相关的元数据信息
# open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
}
}
Nginx深入浅出的更多相关文章
- [转帖]Nginx rewrite模块深入浅出详解
Nginx rewrite模块深入浅出详解 https://www.cnblogs.com/beyang/p/7832460.html rewrite模块(ngx_http_rewrite_modul ...
- 深入浅出Nginx
深入浅出Nginx 文章源自zfz_linux_boy 前言 Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 上图基 ...
- Docker深入浅出系列 | 单机Nginx+Springboot实战
目录 Nginx+Springboot实战 前期准备 实战目标 实战步骤 创建Docker网络 搭建Mysql容器 搭建额度服务集群 搭建Nginx服务 验证额度服务 附录 Nginx+Springb ...
- 深入浅出Nginx实战与架构
本文主要内容如下(让读者朋友们深入浅出地理解Nginx,有代码有示例有图): 1.Nginx是什么? 2.Nginx具有哪些功能? 3.Nginx的应用场景有哪些? 4.Nginx的衍生生态有哪些? ...
- Nginx负载均衡深入浅出
nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以按照轮询.ip哈希.URL哈希.权重等多种方式对后端服务器做负载均 ...
- 深入浅出 nginx lua 为什么高性能
最近很多人问我nginx lua的优势是什么?为什么? 一.同步和异步.阻塞和非阻塞 如果要说清楚这个问题首先要了解:同步和异步.阻塞和非阻塞的关系 同步:php.java的正常代码都是同步执行的 异 ...
- 1.5准备CentOS和Nginx环境「深入浅出ASP.NET Core系列」
准备CentOS 1.1虚拟机 CentOS的安装这里使用vmware workstation 14来做虚拟机,当然你也可以用Oracle的虚拟机或者不用虚拟机,使用云服务或者使用双系统,不是什么大问 ...
- Nginx rewrite模块深入浅出详解
rewrite模块(ngx_http_rewrite_module) nginx通过ngx_http_rewrite_module模块支持url重写.支持if条件判断,但不支持else.另外该模块需要 ...
- 【转】Nginx学习---深入浅出Nginx的介绍
[原文]https://www.toutiao.com/i6595428119933354500/ Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在 ...
随机推荐
- .NET 合并程序集(将 dll 合并到 exe 中)
------------恢复内容开始------------ ------------恢复内容开始------------ 背景:我们的应用程序通常都是由多个程序集组成,例如一个 exe 程序依赖于多 ...
- Asp.net MVC验证那些事(1)-- 介绍和验证规则使用----[转]--[并修改了部分内容]
Asp.net MVC验证那些事(1)-- 介绍和验证规则使用 -----原文地址链接 数据的有效性验证,是程序开发中必不可少的环节.这篇文章,我们将用一个实例来说明如何在MVC中使用Validati ...
- Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)
1.简介 上一篇中宏哥已经教你把JMeter的测试环境搭建起来了,那么这一篇我们就将JMeter启动起来,一睹其芳容,首先宏哥给大家介绍一下如何来创建一个测试计划(Test Plan). 2.创建一个 ...
- Spring 基于设值函数(setter方法)的依赖注入
当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后,通过容器在你的 bean 上调用设值函数,基于设值函数的 DI 就完成了. 下述例子显示了一个类 Text ...
- Kubernetes as Database: 使用kubesql查询kubernetes资源
写在前面 kubectl虽然查询单个的kubernetes资源或者列表都已经比较方便,但是进行更为多个资源的联合查询(比如pod和node),以及查询结果的二次处理方面却是kubectl无法胜任的.所 ...
- Maven系列(一) -- maven仓库的搭建
从今天开始,我要写一个maven系列的文章,以帮助大家来更好的熟悉maven仓库,并且将自己优秀的的代码开源出去,一方面为开源做贡献,另一方面顺便提升自己的知名度,让我们把愉快的开始吧 为什么要搭建m ...
- Java——XML基础知识
XML大小写敏感,不可省略结束标签,可以标签自闭合<img />,属性值必须用引号括起来.CDATA部分用<![CDATA[ ]]>来限定界限,它们是字符数据的一种特殊形式.可 ...
- URL特殊字符转义
在URL中,某些特殊字符会被转义成其它项,为了使这些特殊字符能正确表达,需用%加该字符的ASCII码在URL中显示.
- vue 使用cli脚手架手动创建项目 相关的选择配置及真正项目的开始
转载https://www.jianshu.com/p/635bd3ab7383 根据上述连接将基本的环境和命令和装好 使用命令行 vue create 项目名称 出现选项 选择手动(没有截图展 ...
- PHP 获取当前目录下的所有文件
我们有时候会想拿到当前目录下的所有文件名,以下就是我写的一个方法,请大家参考 // 获取当前文件的上级目录 $con = dirname(__FILE__); // 扫描$con目录下的所有文件 $f ...