前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >nginx 应用指南

nginx 应用指南

作者头像
友儿
发布于 2023-03-11 09:38:13
发布于 2023-03-11 09:38:13
33200
代码可运行
举报
文章被收录于专栏:友儿友儿
运行总次数:0
代码可运行

Nginx基本简述

  • Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器(代理中间件),是一个开源且高性能、可靠的HTTP中间件、代理服务。

Nginx应⽤场景

  • 静态处理
  • 反向代理
  • 负载均衡
  • 资源缓存
  • 安全防护
  • 访问限制
  • 访问认证

Nginx优秀特性

采用I/O多路复用epoll模型

  • IO 多路复用的场景是我们要设计一个高性能的网络服务器,这个网络服务器它可以供多个客户端进行连接并且可以处理这些客户端传上来的请求。当然对于一般来说,应对并发可以写一个多线程的程序,每个传上来的请求都是一个线程。但是多线程的方式存在一个很大的弊端,就是它需要cpu上下文切换,我们知道cpu上下文切换需要处理一些操作句柄,这些过程是非常繁琐的,在上下文切换开销在线程不多、切换不频繁的应用场景下问题不大,但是尤其是客户端的连接非常多的时候,这个cpu上下文切换带来的代价非常的高,因而多线程并不是最好的解决方案。
  • 多线程的方案既然被排除了,那我们把目光转回到单线程,如何用单线程的方案处理大量的客户端的并发连接呢?首先我们先抛出一个疑问,多个客户端同时连接网络服务器,而单线程一次只能处理一个客户端连接,其他连接是否会被抛弃呢?当然肯定是不会被抛弃的,原因是接受处理客户端的连接的并不是cpu,因为我们有专门专注处理IO的DNA控制器。
  • I/O多路复用以及关于DMA介绍 请移步 《线程/协程/异步的编程模型解读》 了解

线程/协程/异步的编程模型解读

线程线程是CPU调度的最小单位CPU 执行过程图比如我们有一个单核CPU,目前有3个想要执行的线程,这3个线程在执...

  • IO多路复⽤的实现⽅式有 select、poll、Epool模型 请移步 《什么是select/poll/epoll模型?》 了解

什么是select/poll/epoll模型?

模型图单线程处理我们自己会怎样写单线程处理多个客户端连接呢?我们知道在linux里面中每个网络连接在内核中都是文件...

轻量级

  • 功能模块化
  • 代码模块化

CPU亲和(affinity)

  • 将CPU核⼼和Nginx⼯作进程绑定⽅式,把每个worker进程固定在⼀个cpu上执⾏,减少切换cpu 的 cache miss ,获得更好的性能。

sendfile

  • 传统⽂件传输, 在实现上其实是⽐较复杂的, 其具体流程细节如下:
代码语言:txt
AI代码解释
复制
- 调⽤read函数,⽂件数据被复制到内核缓冲
- read函数返回,⽂件数据从内核缓冲区复制到⽤户缓冲区
- write函数调⽤,将⽂件数据从⽤户缓冲区复制到内核与socket相关的缓冲区。
- 数据从socket缓冲区复制到相关协议引擎。
传统⽂件传输数据实际上是经过了四次复制操作:
  • 硬盘—>内核buf—>⽤户buf—>socket缓冲区(内核)—>协议引擎
也就是说传统的⽂件传输需要经过多次上下⽂的切换才能完成拷⻉或读取, 效率不⾼。
  • sendfile⽂件传输是在内核中操作完成的, 函数直接在两个⽂件描述符之间传递数据, 从⽽避免了 内核缓冲区数据和⽤户缓冲区数据之间的拷⻉, 操作效率很⾼, 被称之为零拷⻉。
代码语言:txt
AI代码解释
复制
- 系统调⽤sendfile函数通过 DMA 把硬盘数据拷⻉到 kernel buffer,
- 数据被 kernel 直接拷⻉到另外⼀个与 socket 相关的 kernel buffer。
- DMA把数据从kernel buffer直接拷⻉给协议栈。
这⾥没有⽤户空间和内核空间之间的切换,在内核中直接完成了从⼀个buffer到另⼀个buffer的拷⻉。

Nginx快速安装

  • 版本
代码语言:txt
AI代码解释
复制
- Mainline version 开发版
- Stable version 稳定版
- Legacy version 历史版本安装请移步到
代码语言:txt
AI代码解释
复制
- 我这里提供 [Ubuntu安装最新版nginx点击这里](https://github.com/niuzheng131400/ubuntu-install-the-latest-stable-version-of-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内置变量

⾃定义变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$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配置
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验