Nginx简介
1. 什么是nginx?
-
Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。
-
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
-
nginx由C编程语言编写,目前nginx已被移植到许多架构和操作系统,包括Linux,FreeBSD,Solaris,Mac OS X,AIX和Microsoft Windows,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
2. nginx的优势
-
高并发:Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,处理高并发能力是十分强大的,有报告表明能支持高达 50,000 个并发连接数。
-
内存占用少:Nginx+PHP(FastCGI)服务器,在3万并发连接下,开启10个Nginx进程消耗150MB内存,15MB*10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB*64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。
-
成本低廉:购买F5BIG-IP、NetScaler等硬件负载均衡交换机,需要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费试用,并且可用于商业用途。BSD开源协议是一个给使用者很大自由的协议,协议指出可以自由使用、修改源代码、也可以将修改后的代码作为开源或专用软件再发布。
-
配置文件简洁:网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。
-
内置健康检查功能:如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。
-
节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头。
-
稳定性高:用于反向代理,宕机的概率微乎其微。
-
支持热部署:启动简单,可以做到7*24不间断运行。几个月都不需要重新启动。
-
支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化。
3. nginx的基本功能
- 静态资源部署
- Rewrite地址重写
- http、smtp、pop3协议的反向代理服务器
- 负载均衡
- web缓存
- 支持FastCGI(fpm,LNMP),uWSGI(Python)等协议
- 模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
- 支持SSL
4. nginx的扩展功能
-
基于名称和IP的虚拟主机
-
支持keepalive
-
支持平滑升级
-
定制访问日志、支持使用日志缓冲区提高日志存储性能
-
支持URL重写
-
支持路径别名
-
支持基于IP及用户的访问控制
-
支持速率限制,支持并发数限制
5. nginx的应用类别
-
使用nginx结合FastCGI运行PHP、JSP、Perl等程序
-
使用nginx作反向代理、负载均衡、规则过滤
-
使用nginx运行静态HTML网页、图片
-
nginx与其他新技术的结合应用
6. nginx的模块分类
6.1 nginx的模块从结构上分为核心模块、基础模块和第三方模块
- HTTP模块、EVENT模块和MAIL模块等属于核心模块
- HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块
- HTTP Upstream模块、Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块
用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大
6.2 nginx模块从功能上分为四类,分别是:
- Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个
- Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出
- Proxies(代理器模块)。就是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能
- Core(核心模块):构建nginx基础服务、管理其他模块。
Nginx的核心模块主要负责建立nginx服务模型、管理网络层和应用层协议、以及启动针对特定应用的一系列候选模块。其他模块负责分配给web服务器的实际工作:
- 当Nginx发送文件或者转发请求到其他服务器,由Handlers(处理模块)或Proxies(代理类模块)提供服务;
- 当需要Nginx把输出压缩或者在服务端加一些东西,由Filters(过滤模块)提供服务。
7. nginx架构和工作流程
启动nginx时,会启动一个Master进程,这个进程不处理任何客户端的请求,主要用来产生worker线程,一个worker线程用来处理n个request。
Nginx真正处理请求业务的是Worker之下的线程,worker进程中有一个ngx_worker_process_cycle()函数,执行无限循环,不断处理收到的来自客户端的请求,并进行处理,直到整个Nginx服务被停止。
worker 进程中,ngx_worker_process_cycle()函数就是这个无限循环的处理函数。在这个函数中,一个请求的简单处理流程如下:
- 操作系统提供的机制(例如 epoll, kqueue 等)产生相关的事件。
- 接收和处理这些事件,如是接收到数据,则产生更高层的 request 对象。
- 处理 request 的 header 和 body。
- 产生响应,并发送回客户端。
- 完成 request 的处理。
- 重新初始化定时器及其他事件。
从 Nginx 的内部来看,一个 HTTP Request 的处理过程涉及到以下几个阶段:
初始化 HTTP Request(读取来自客户端的数据,生成 HTTP Request 对象,该对象含有该请求所有的信息)。
处理请求头。
处理请求体。 如果有的话,调用与此请求(URL 或者 Location)关联的 handler。 依次调用各 phase handler 进行处理。
8. 正向代理和反向代理
正向代理(Forward Proxy):常规访问流程为客户端向服务端发送请请求数据,服务端回应。而使用了正向代理之后改为客户端向代理服务器发送请求数据,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器进行通信再返回数据给客户端。
正向代理隐藏了真实的客户端,为客户端收发请求,使真实的客户端对服务器不可见。
应用场景:
- 正向代理一般用来访问原来无法访问的网络资源,比如Google、YouTube等国外网站,常规访问无法访问这些网站的资源,使用了正向代理之后即可实现资源访问。
反向代理(Reverse Proxy):与正向代理相比,使用反向代理后,代理服务器收到数据之后将数据转发给内部网络的真实服务器进行处理,然后再将结果返回给客户端。
反向代理隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。
应用场景:
-
保障服务器的安全:使用反向代理后,用户端将无法直接通过请求访问真正的内容服务器,而必须首先通过Nginx。可以通过在Nginx层上将危险或者没有权限的请求内容过滤掉,从而保证了服务器的安全。
-
负载均衡:当客户端较多、访问量较大时,使用反向代理可以帮助单个服务器避免过载,因为网站的所有流量都必须通过反向代理。只有这样,流量才能访问特定的后端服务器。
-
提升网站性能:正向代理服务器可以缓存网站内容,更好的处理客户端的数据访问。
简单的说,一般给客户端做代理的就是正向代理,给服务器做代理的就是反向代理
9. nginx的安装
创建系统用户nginx
[root@rh4 ~]# useradd -r -M -s /sbin/nologin nginx
[root@rh4 ~]# id nginx
uid=988(nginx) gid=984(nginx) 组=984(nginx)
安装相关依赖包
[root@rh4 ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
下载nginx
[root@rh4 ~]# cd /usr/src/
[root@rh4 src]# wget https://nginx.org/download/nginx-1.22.0.tar.gz
--2022-10-10 15:55:39-- https://nginx.org/download/nginx-1.22.0.tar.gz
正在解析主机 nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5702::6, ...
正在连接 nginx.org (nginx.org)|3.125.197.172|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1073322 (1.0M) [application/octet-stream]
正在保存至: “nginx-1.22.0.tar.gz”
nginx-1.22.0.tar.gz 100%[===============================================================================>] 1.02M 454KB/s 用时 2.3s
2022-10-10 15:55:43 (454 KB/s) - 已保存 “nginx-1.22.0.tar.gz” [1073322/1073322])
编译安装
[root@rh4 src]# tar xf nginx-1.22.0.tar.gz
[root@rh4 src]# ls
debug kernels nginx-1.22.0 nginx-1.22.0.tar.gz
[root@rh4 src]# cd nginx-1.22.0/
[root@rh4 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
......
Configuration summary
+ using system PCRE2 library
+ using system OpenSSL library
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/var/log/nginx/error.log"
nginx http access log file: "/var/log/nginx/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
[root@rh4 nginx-1.22.0]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
略......
#查看版本
[root@rh4 nginx-1.22.0]# nginx -v
nginx version: nginx/1.22.0
配置环境变量
[root@rh4 ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@rh4 ~]# source /etc/profile.d/nginx.sh
[root@rh4 ~]# nginx
#查看80端口是否开启
[root@rh4 ~]# ss -tanl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
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 [::]:*
[root@rh4 ~]#
nginx基础命令
nginx -t 检查配置文件语法
nginx -v 查看版本
nginx -c 指定配置文件路径
nginx -s 发送服务控制信号,可选值有{stop|quit|reopen|reload}
nginx的配置文件详解
主配置文件:/usr/local/nginx/conf/nginx.conf
默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
可以在启动nginx时通过-c选项来指定要读取的配置文件
nginx常见的配置文件及其作用
配置文件 | 作用 |
---|---|
nginx.conf | nginx的基本配置文件 |
mime.types | MIME类型关联的扩展文件 |
fastcgi.conf | 与fastcgi相关的配置 |
proxy.conf | 与proxy相关的配置 |
sites.conf | 配置nginx提供的网站,包括虚拟主机 |