nginx 简介与安装

nginx 简介

nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD­like 协议下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。是由伊戈尔ꞏ赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

nginx 的特性

nginx 是一个很牛的高性能 Web 和反向代理服务器,它具有很多非常优越的特性:

  • 在高连接并发的情况下,nginx 是 Apache 服务器不错的替代品,能够支持高达 50000 个并发连接数的响应
  • 使用 epoll and kqueue 作为开发模型
  • nginx 作为负载均衡服务器:nginx 既可在内部直接支持和 PHP 程序对外进行服务,也可支持作为 HTTP 代理服务器对外进行服务
  • nginx 采用 C 进行编写,不论系统资源开销还是 CPU 使用效率都比 Perlbal 要好很多

nginx 的优点

  • 更快:
    • 单次请求会得到更快的响应。
    • 在高并发环境下,nginx 比其他 WEB 服务器有更快的响应。
  • 高扩展性:
    • nginx 是基于模块化设计,由多个耦合度极低的模块组成,因此具有很高的扩展性。许多高流量的网站都倾向于开发符合自己业务特性的定制模块。
  • 高可靠性:
    • nginx 的可靠性来自于其核心框架代码的优秀设计,模块设计的简单性。另外,官方提供的常用模块都非常稳定,每个 worker 进程相对独立,master 进程在一个 worker 进程出错时可以快速拉起新的 worker 子进程提供服务。
  • 低内存消耗:
    • 一般情况下,10000 个非活跃的 HTTP Keep­Alive 连接在 nginx 中仅消耗 2.5MB 的内存,这是 nginx 支持高并发连接的基础。
    • 单机支持 10 万以上的并发连接:理论上,nginx 支持的并发连接上限取决于内存,10 万远未封顶。
  • 热部署:
    • master 进程与 worker 进程的分离设计,使得 nginx 能够提供热部署功能,即在 7x24 小时不间断服务的前提下,升级 nginx 的可执行文件。当然,它也支持不停止服务就更新配置项,更换日志文件等功能。
  • 最自由的 BSD 许可协议:
    • 这是 nginx 可以快速发展的强大动力。BSD 许可协议不只是允许用户免费使用 nginx ,它还允许用户在自己的项目中直接使用或修改 nginx 源码,然后发布。

nginx基本功能

  • 静态资源的 web 服务器,能缓存打开的文件描述符
  • http、smtp、pop3 协议的反向代理服务器
  • 缓存加速、负载均衡 支持 FastCGI(fpm,LNMP),uWSGI(Python)等
  • 模块化(非 DSO 机制),过滤器 zip、SSI 及图像的大小调整
  • 支持SSL

nginx 扩展功能

  • 基于名称和 IP 的虚拟主机
  • 支持 keepalive
  • 支持平滑升级
  • 定制访问日志、支持使用日志缓冲区提高日志存储性能
  • 支持 url rewrite
  • 支持路径别名
  • 支持基于 IP 及用户的访问控制
  • nginx 基于用户的访问控制需要借助于 httpd 的 htpassword 来实现
  • 支持速率限制,支持并发数限制

nginx 的应用类别

  • 使用 nginx 结合 FastCGI 运行 PHP、JSP、Perl 等程序
  • 使用 nginx 作反向代理、负载均衡、规则过滤
  • 使用 nginx 运行静态 HTML 网页、图片
  • nginx 与其他新技术的结合应用

nginx 的模块

nginx 由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个 location block(location 是 nginx 配置中的一个指令,用于 URL 匹配),而在这个 location 中所配置的每个指令将会启动不同的模块去完成相应的工作。

在这里插入图片描述

nginx 的模块从结构上分为核心模块、基础模块和第三方模块

HTTP 模块、EVENT 模块和 MAIL 模块等属于核心模块
HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块属于基本模块
HTTP Upstream 模块、Request Hash 模块、Notice 模块和 HTTP Access Key 模块属于第三方模块
用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx 的功能才会如此强大

nginx 模块从功能上分为三类
Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改 headers 信息等操作。handlers 处理器模块一般只能有一个
Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由 nginx 输出
Proxies(代理器模块)。就是 nginx 的 HTTP Upstream 之类的模块,这些模块主要与后端一些服务。比如 fastcgi- 等操作交互,实现服务代理和负载均衡等功能

nginx 模块分为:核心模块、事件模块、标准 HTTP 模块、可选 HTTP 模块、邮件模块、第三方模块和补丁等

nginx 基本模块:所谓基本模块,指的是 nginx 默认的功能模块,它们提供的指令,允许你使用定义 nginx 基本功能的变量,在编译时不能被禁用,包括:

  • 核心模块:基本功能和指令,如进程管理和安全。常见的核心模块指令,大部分是放置在配置文件的顶部
  • 事件模块:在 nginx 内配置网络使用的能力。常见的 events(事件)模块指令,大部分是放置在配置文件的顶部
  • 配置模块:提供包含机制具体的指令,请参考 nginx 的官方链接

nginx 的工作原理

nginx 的模块直接被编译进 nginx,因此属于静态编译方式。

启动 nginx 后,nginx 的模块被自动加载,与 Apache 不一样,首先将模块编译为一个 so 文件,然后在配置文件中指定是否进行加载。

在解析配置文件时,nginx 的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。

nginx 的进程架构:
启动 nginx 时,会启动一个 Master 进程,这个进程不处理任何客户端的请求,主要用来产生 worker 线程,一个 worker 线程用来处理 n 个 request。

在这里插入图片描述

nginx 主要由一个 master 主进程和多个 worker 进程

master 主进程主要是管理 worker 进程,对网络事件进行收集和分发:
接收来自外界的信号
向各 worker 进程发送信号
监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程
nginx 用一个独立的 worker 进程来处理一个请求,一个 worker 进程可以处理多个请求:
当一个 worker 进程在 accept 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。
一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。采用这种方式的好处节省锁带来的开销。对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查上时,也会方便很多
独立进程,减少风险。
采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快重新启动新的 worker 进程。在一次请求里无需进程切换

web 服务器请求资源过程
在这里插入图片描述

  1. 客户端发起请求,然后与服务端建立 tcp 连接
  2. 服务器接收请求
  3. 进行反向代理,然后服务器处理请求
  4. 查看访问资源的类型(可能是本地的资源,也可能是通过 NFS 挂载的资源)
  5. 构建响应报文
  6. 通过网络接口返回响应报文给客户端
  7. 服务端将本次的操作记录到日志中

在这里插入图片描述
详细流程
client:输入网址 –> 发起 http request –> 等待 web server 响应。
server:收到 client请求 –> 加载资源 –> 构建响应报文,发给client。
client 发起 http 请求
client 将键入的域名解析为 server 端的 IP 地址(DNS解析)。
client 与 server 进行 TCP 连接(三次握手))。
client 与 web server 数据传输.。
client 与 web server 断开 TCP 连接(四次挥手)
client 解释 HTML 文档,浏览器渲染,将在屏幕上显示渲染后的图形结果
server 收到 client 请求时
http request 请求首先到达 server 端的公网 IP 上(公网 IP 一般配置在硬件防火墙上)。
经过防火墙过滤之后,到达负载均衡层(可能涉及四层负载均衡和七层负载均衡),负载均衡将请求报文往后端 Real Server 调度。
经过 lvs 调度至后端 RS 上,此时后端提供 web 服务的一般是 nginx)Apache也可能),nginx 判断请求报文是动态资源还是静态资源(动静分离)。
静态资源:由 nginx 发起系统调用,请求内核从磁盘加载相应的资源文件,可能涉及存储服务器(资源的保存的服务器)。
动态资源:由 nginx 代理给能处理动态资源的服务器(Tomcat、PHP 等),还可能涉及访问数据库服务器。

web server 将请求的资源加载完成之后,构建响应报文发送给 client。

安装

关闭防火墙和 SELinux

[root@k ~]# systemctl stop firewalld

[root@k ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

[root@k ~]# vim /etc/sysconfig/selinux
SELINUX=disabled

[root@k ~]# reboot

创建 nginx 用户

[root@k ~]# useradd -r -M -s /sbin/nologin nginx

安装开发工具包

[root@k ~]# dnf group mark -y install "Development Tools"

安装依赖包和常用工具

[root@k ~]# yum install -y pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make wget

下载 nginx 的压缩包

[root@k ~]# wget http://nginx.org/download/nginx-1.22.0.tar.gz

解压

[root@k ~]# tar xf nginx-1.22.0.tar.gz -C /usr/local/
[root@k ~]# cd /usr/local/
[root@k local]# ls
bin  etc  games  include  lib  lib64  libexec  nginx-1.22.0  sbin  share  src

编译安装

[root@k local]# cd nginx-1.22.0/
[root@k nginx-1.22.0]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-debug \
> --with-http_ssl_module \
> --with-http_realip_module \
> --with-http_image_filter_module \
> --with-http_gunzip_module \
> --with-http_gzip_static_module \
> --with-http_stub_status_module \
> --http-log-path=/var/log/nginx/access.log \
> --error-log-path=/var/log/nginx/error.log

[root@k nginx-1.22.0]# make && make install

设置环境变量

[root@k nginx-1.22.0]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh

[root@k nginx-1.22.0]# . /etc/profile.d/nginx.sh

启动 nginx

[root@k nginx-1.22.0]# ss -antl
State    Recv-Q   Send-Q       Local Address:Port       Peer Address:Port   Process   
LISTEN   0        128                0.0.0.0:22              0.0.0.0:*                
LISTEN   0        128                   [::]:22                 [::]:*                

[root@k nginx-1.22.0]# nginx

[root@k nginx-1.22.0]# ss -antl
State    Recv-Q   Send-Q       Local Address:Port       Peer Address:Port   Process   
LISTEN   0        128                0.0.0.0:22              0.0.0.0:*                
LISTEN   0        128                0.0.0.0:80              0.0.0.0:*                
LISTEN   0        128                   [::]:22                 [::]:*                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值