Nginx基本简述
- Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器(代理中间件),是一个开源且高性能、可靠的HTTP中间件、代理服务。
Nginx应⽤场景
- 静态处理
- 反向代理
- 负载均衡
- 资源缓存
- 安全防护
- 访问限制
- 访问认证
Nginx优秀特性
采用I/O多路复用epoll模型
- IO 多路复用的场景是我们要设计一个高性能的网络服务器,这个网络服务器它可以供多个客户端进行连接并且可以处理这些客户端传上来的请求。当然对于一般来说,应对并发可以写一个多线程的程序,每个传上来的请求都是一个线程。但是多线程的方式存在一个很大的弊端,就是它需要cpu上下文切换,我们知道cpu上下文切换需要处理一些操作句柄,这些过程是非常繁琐的,在上下文切换开销在线程不多、切换不频繁的应用场景下问题不大,但是尤其是客户端的连接非常多的时候,这个cpu上下文切换带来的代价非常的高,因而多线程并不是最好的解决方案。
- 多线程的方案既然被排除了,那我们把目光转回到单线程,如何用单线程的方案处理大量的客户端的并发连接呢?首先我们先抛出一个疑问,多个客户端同时连接网络服务器,而单线程一次只能处理一个客户端连接,其他连接是否会被抛弃呢?当然肯定是不会被抛弃的,原因是接受处理客户端的连接的并不是cpu,因为我们有专门专注处理IO的DNA控制器。
- I/O多路复用以及关于DMA介绍 请移步
《线程/协程/异步的编程模型解读》
了解
- IO多路复⽤的实现⽅式有 select、poll、Epool模型 请移步
《什么是select/poll/epoll模型?》
了解
轻量级
- 功能模块化
- 代码模块化
CPU亲和(affinity)
- 将CPU核⼼和Nginx⼯作进程绑定⽅式,把每个worker进程固定在⼀个cpu上执⾏,减少切换cpu
的cache miss
,获得更好的性能。
sendfile
传统⽂件传输, 在实现上其实是⽐较复杂的, 其具体流程细节如下:
- 调⽤read函数,⽂件数据被复制到内核缓冲
- read函数返回,⽂件数据从内核缓冲区复制到⽤户缓冲区
- write函数调⽤,将⽂件数据从⽤户缓冲区复制到内核与socket相关的缓冲区。
- 数据从socket缓冲区复制到相关协议引擎。
传统⽂件传输数据实际上是经过了四次复制操作:
- 硬盘—>内核buf—>⽤户buf—>socket缓冲区(内核)—>协议引擎
也就是说传统的⽂件传输需要经过多次上下⽂的切换才能完成拷⻉或读取, 效率不⾼。
sendfile⽂件传输是在内核中操作完成的, 函数直接在两个⽂件描述符之间传递数据, 从⽽避免了
内核缓冲区数据和⽤户缓冲区数据之间的拷⻉, 操作效率很⾼, 被称之为零拷⻉。- 系统调⽤sendfile函数通过 DMA 把硬盘数据拷⻉到 kernel buffer,
- 数据被 kernel 直接拷⻉到另外⼀个与 socket 相关的 kernel buffer。
- DMA把数据从kernel buffer直接拷⻉给协议栈。
这⾥没有⽤户空间和内核空间之间的切换,在内核中直接完成了从⼀个buffer到另⼀个buffer的拷⻉。
Nginx快速安装
版本
- Mainline version 开发版
- Stable version 稳定版
- Legacy version 历史版本
安装请移步到nginx官网
Nginx安装⽬录
路径 | 类型 | 作⽤ |
---|---|---|
/etc/nginx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf | 配置⽂件 | Nginx主配置⽂件 |
/etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params | 配置⽂件 | Cgi、Fastcgi、Uwcgi配置⽂件 |
/etc/nginx/win-utf /etc/nginx/koi-utf /etc/nginx/koi-win | 配置⽂件 | Nginx编码转换映射⽂件 |
/etc/nginx/mime.types | 配置⽂件 | http协议的Content-Type与扩展名 |
/usr/lib/systemd/system/nginx.service | 配置⽂件 | 配置系统守护进程管理器 |
/etc/logrotate.d/nginx | 配置⽂件 | Nginx⽇志轮询,⽇志切割 |
/usr/sbin/nginx /usr/sbin/nginx-debug | 命令 | Nginx终端管理命令 |
/etc/nginx/modules /usr/lib64/nginx /usr/lib64/nginx/modules | ⽬录 | Nginx模块⽬录 |
/usr/share/nginx /usr/share/nginx/html /usr/share/nginx/html/50x.html /usr/share/nginx/html/index.html | ⽬录 | Nginx默认站点⽬录 |
/usr/share/doc/nginx-1.12.2 /usr/share/man/man8/nginx.8.gz | ⽬录 | Nginx的帮助⼿册 |
/var/cache/nginx | ⽬录 | Nginx的缓存⽬录 |
/var/log/nginx | ⽬录 | Nginx的⽇志⽬录 |
Nginx编译参数
编译选项 | 作⽤ |
---|---|
--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock | 程序安装⽬录和路径 |
--http-client-body-temp-path=/var/cache/nginx/client_tem --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp | 临时缓存⽂件 |
--user=nginx --group=nginx | 设定Nginx进程启动⽤户和组(安全) |
--with-cc-opt | 设置额外的参数将被添加到CFLAGS变量 |
--with-ld-opt | 设置附加的参数, 链接系统库 |
Nginx常⽤模块
Nginx编译选项 | 模块作⽤ |
---|---|
ngx_http_core_module | 包含⼀些核⼼的http参数配置,对应Nginx的配置区块部分 |
ngx_http_access_module | 访问控制模块,⽤来控制⽹站⽤户对Nginx的访问 |
ngx_http_gzip_module | 压缩模块,对Nginx返回的数据压缩,属于性能优化模块 |
ngx_http_fastcgi_module | fastci模块,和动态应⽤相关的模块,例如PHP |
ngx_http_proxy_module | proxy代理模块 |
ngx_http_upstream_module | 负载均衡模块,可以实现⽹站的负载均衡功能及节点的健康检查。 |
ngx_http_rewrite_module | URL地址重写模块 |
ngx_http_limit_conn_module | 限制⽤户并发连接数及请求数模块 |
ngx_http_limit_req_module | 限制Nginx request processing rate根据定义的keyNginx常⽤模块 |
ngx_http_log_module | 访问⽇志模块,以指定的格式记录Nginx客户访问⽇志等信息 |
ngx_http_auth_basic_module | Web认证模块,设置Web⽤户通过账号密码访问Nginx |
nginx_http_ssl_module | ssl模块,⽤于加密的http连接,如https |
Nginx内置变量
http核⼼模块的内置变量
- http请求变量
- Nginx内置变量
⾃定义变量
$uri: 当前请求的uri,不带参数 $request_uri: 请求的uri,带完整参数 $host: http请求报⽂中host⾸部,如果没有则以处理此请求的虚拟主机的主机名代替 $hostname: nginx服务运⾏在主机的主机名 $remote_addr: 客户端IP $remote_port: 客户端端⼝ $remote_user: 使⽤⽤户认证时客户端⽤户输⼊的⽤户名 $request_filename: ⽤户请求中的URI经过本地root或alias转换后映射的本地⽂件路径 $request_method: 请求⽅法, GET POST PUT $server_addr: 服务器地址 $server_name: 服务器名称 $server_port: 服务器端⼝ $server_protocol: 服务器向客户端发送响应时的协议, 如http/1.1 http/1.0 $scheme:在请求中使⽤scheme, 如http://xxx.com中的http $http_HEADER: 匹配请求报⽂中指定的HEADER $http_host: 匹配请求报⽂中的host⾸部 $document_root: 当前请求映射到的root配置
Nginx状态码
Comment here is closed