初识Nginx
正向代理和反向代理的区别
简而言之,正向代理隐藏的是客户端,服务于客户端,而反向代理隐藏的是服务器,服务于服务器。
正向代理
- 服务对象:正向代理的服务对象是客户端。它允许客户端通过代理来访问互联网上的资源。正向代理代表客户端去获取信息。
- 使用场景:常用于客户端绕过网络限制(比如访问地理上受限的网站)、进行匿名访问、或在客户端和互联网之间提供缓存服务。
- 工作方式:客户端配置代理服务器,当客户端发送请求时,请求首先发送到正向代理服务器,然后代理服务器代表客户端向目标服务器发送请求,获取资源后再转发给客户端。
反向代理
- 服务对象:反向代理的服务对象是服务端。它接收互联网上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给互联网上请求连接的客户端。
- 使用场景:常用于负载均衡、加密和SSL加速、缓存静态内容、压缩内容、减少服务器直接暴露在外的安全风险等。
- 工作方式:客户端对某个网站发起请求,反向代理服务器接收请求后,将请求转发到内部服务器,并将服务器的响应结果返回给客户端。对于客户端来说,它感觉就像是直接与反向代理服务器进行通信一样。
Nginx的常用功能
Nginx提供的基本功能服务从大体上归纳为”基本HTTP服务”、“高级 HTTP服务”和”邮件服务”等三大类。
基本HTTP服务
Nginx可以提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服 务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持 包过滤功能,支持SSL等。
- 处理静态文件、处理索引文件以及支持自动索引;
- 提供反向代理服务器,并可以使用缓存加上反向代理,同时完成负载 均衡和容错;
- 提供对FastCGI、memcached等服务的缓存机制,,同时完成负载均 衡和容错;
- 使用Nginx的模块化特性提供过滤器功能。
- Nginx基本过滤器包括 gzip压缩、ranges支持、chunked响应、XSLT、SSI以及图像缩放 等。其中针对包含多个SSI的页面,经由FastCGI或反向代理,SSI过 滤器可以并行处理。
- 支持HTTP下的安全套接层安全协议SSL.
- 支持基于加权和依赖的优先权的HTTP/2
高级HTTP服务
- 持基于名字和IP的虚拟主机设置
- 支持HTTP/1.0中的KEEP-Alive模式和管线(PipeLined)模型连接
- 自定义访问日志格式、带缓存的日志写操作以及快速日志轮转。
- 提供3xx~5xx错误代码重定向功能
- 支持重写(Rewrite)模块扩展
- 支持重新加载配置以及在线升级时无需中断正在处理的请求
- 支持网络监控
- 支持FLV和MP4流媒体传输
邮件服务
Nginx提供邮件代理服务也是其基本开发需求之一,
主要包含以下特 性:
- 支持IMPA/POP3代理服务功能
- 支持内部SMTP代理服务功能
Nginx管理
Nginx目录
配置目录 (
/etc/nginx/
):这是 Nginx 的主要配置目录。它包含了 Nginx 的主配置文件
nginx.conf
和其他可选的配置文件。nginx.conf
是 Nginx 服务器的主配置文件,用于控制 Nginx 的全局设置。通常还包括
sites-available
和sites-enabled
子目录,用于存放单独的网站配置文件。sites-available
包含可用的网站配置,而sites-enabled
通常包含指向sites-available
中实际启用的网站配置的链接。conf/: 这是配置文件目录,存放
Nginx
的配置文件。fastcgi.conf
和fastcgi_params
: 这两个文件与fastcgi
协议相关的参数配置,通常用于优化与fastcgi
进程(如PHP-FPM
)的交互。koi-utf
和koi-win
: 这些是字符集映射表文件,用于在koi8-r
和其他字符集之间进行转换。mime.types
: 用于设置Nginx
中不同文件类型的MIME
类型。nginx.conf
: 这是Nginx
的主配置文件,用于定义服务器的工作模式以及各种类型的设置。scgi_params
: 用于配置与SCGI
协议相关的参数。uwsgi_params
: 用于配置与uWSGI
服务器交互的参数。win-utf
: 用于字符集转换的配置文件。
日志目录 (
/var/log/nginx/
):- 存放 Nginx 的日志文件,包括访问日志 (
access.log
) 和错误日志 (error.log
)。 - 访问日志记录了所有的客户端请求,而错误日志记录了服务器运行中的错误信息。
- 存放 Nginx 的日志文件,包括访问日志 (
HTML 目录 (
/usr/share/nginx/html/
或/var/www/html/
):- 这是 Nginx 的默认文档根目录,用于存放网站的静态文件,如 HTML 文件、图片等。
- 在默认配置中,当访问服务器的根 URL 时,Nginx 会从这个目录中提供内容。
可执行文件目录 (
/usr/sbin/nginx
):- 这里存放的是 Nginx 服务器的可执行文件(二进制可执行文件)。
- 通过这个文件,可以启动、停止、重载 Nginx 配置等。
系统库目录 (
/var/lib/nginx/
):- 用于存放与 Nginx 运行相关的文件,如临时文件和缓存。
客户端体积限制目录 (
/var/cache/nginx/
):- 当启用代理缓存或快速CGI缓存时,缓存的内容会存储在这个目录下。
Nginx服务的信号控制
方式一:Nginx服务的信号控制
1 | ginx中的master和worker进程? |
前面在提到Nginx的高性能,其实也和它的架构模式有关。Nginx默认采 用的是多进程的方式来工作的,当将Nginx启动后,我们通过 ps -ef | grep nginx
命令可以查看到如下内容:
从上图中可以看到,Nginx后台进程中包含一个master进程和多个worker 进程,master进程主要用来管理worker进程,包含接收外界的信息,并 将接收到的信号发送给各个worker进程,监控worker进程的状态,当 worker进程出现异常退出后,会自动重新启动新的worker进程。而 worker进程则是专门用来处理用户请求的,各个worker进程之间是平等 的并且相互独立,处理请求的机会也是一样的。
要想操作Nginx的master进程,就需要获取到master进程的进程 号ID。获取方式简单介绍两个,
- 方式一:通过
ps -ef | grep nginx
; - 方式二:在讲解nginx的 ./configure 的配置参数的时候,有一个参数 是
--pid-path=PATH
默认是/usr/local/nginx/logs/nginx.pid
,所以 可以通过查看该文件来获取nginx的master进程ID.
对应的信号
通过命令调用: kill -signal PID
这几说明(飘`号)的作用: 它可以将飘号里面的执行完之后作为输出结果展示出来
- 发送TERM/INT信号给master进程,会将Nginx服务立即关闭。
1 | kill -TERM PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid` |
- 发送QUIT信号给master进程,master进程会控制所有的work进程不 再接收新的请求,等所有请求处理完后,在把进程都关闭掉。
1 | kill -QUIT PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid` |
- 发送HUP信号给master进程,master进程会把控制旧的work进程不 再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根 据nginx的配置文件重新启动新的work进程
1 | kill -HUP PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid` |
- 发送USR1信号给master进程,告诉Nginx重新开启日志文件
1 | kill -USR1 PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid` |
- 发送USR2信号给master进程,告诉master进程要平滑升级,这个时 候,会重新开启对应的master进程和work进程,整个系统中将会有 两个master进程,并且新的master进程的PID会被记录 在 /usr/local/nginx/logs/nginx.pid 而之前的旧的master进程 PID会被记录在 /usr/local/nginx/logs/nginx.pid.oldbin 文件 中,接着再次发送QUIT信号给旧的master进程,让其处理完请求后 再进行关闭
1 | kill -USR2 PID / kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` |
发送WINCH信号给master进程,让master进程控制不让所有的work 进程在接收新的请求了,请求处理完后关闭work进程。注意master 进程不会被关闭掉
1 | kill -WINCH PID /kill -WINCH`cat /usr/local/nginx/logs/nginx.pid` |
方式二:Nginx的命令行控制
此方式是通过Nginx安装目录下的sbin下(注意跳转到对应的目录下)的可执行文件nginx来进行 Nginx状态的控制,我们可以通过
nginx -h
来查看都有哪些参数可以 用:
-?和-h:显示帮助信息
-v:打印版本号信息并退出
-V:打印版本号信息和配置信息并退出
-t:测试nginx的配置文件语法是否正确并退出
-T:测试nginx的配置文件语法是否正确并列出用到的配置文件信息然后 退出
-q:在配置测试期间禁止显示非错误消息
-s:signal信号,后面可以跟 :
- stop[快速关闭,类似于TERM/INT信号的作用]
- quit[优雅的关闭,类似于QUIT信号的作用]
- reopen[重新打开日志文件类似于USR1信号的作用]
- reload[类似于HUP信号的作用]
-p:prefix,指定Nginx的prefix路径,(默认为: /usr/local/nginx/)
-c:filename,指定Nginx的配置文件路径,(默认为: conf/nginx.conf)
-g:用来补充Nginx配置文件,向Nginx服务指定启动时应用全局的配置
**如果想对Nginx的版本进行更新,或者要应用一些新的模块,最简单的 做法就是停止当前的Nginx服务,然后开启新的Nginx服务。但是这样会 导致在一段时间内,用户是无法访问服务器。为了解决这个问题,我们 就需要用到Nginx服务器提供的平滑升级功能。这个也是Nginx的一大特 点,使用这种方式,就可以使Nginx在7_24小时不间断的提供服务了。_
Nginx核心配置文件
Nginx的核心配置文件默认是放 在
/usr/local/nginx/conf/nginx.conf
,读取Nginx自带的Nginx配置文件,我们将其中的注释部分【学习一个技术点就是在Nginx的配置文件中可以使用 # 来注释】删除掉后,就剩下下 面内容:
1 | user nginx; |
配置文件结构
Nginx的配置文件默认主要分为三大块: events块、http块、以及之外的就被成为全局块。
http块中可以配置多个server块,每个server块又可以配置多个location 块。
下面我们来简单介绍一下三大块
全局块
全局块,主要设置Nginx服务器整体运行的配置指令
- 全局块中的user指令
这里的user就是我们使用的系统的user, 以Ubuntu为例。 使用root用户, 那么配置的用户和用户组都是root, 如果我们这里配置的用户为rayce, 那么配置文件的所属用户和用户组都是rayce,如果不使用user命令来改变对应的用户, 那么就会出现权限问题
user
指令用于指定Nginx
工作进程运行的用户以及用户组。这个指令决定了Nginx
服务器进程执行的系统权限级别。 这里我们最好不要设置为root用户。
当然如果我们随意的修改user后面的用户, 那么还需要修改location中的html页面对应的地址, 否则就会报错。
- 全局块中的work process指令(工作进程相关的指令)
master_process:用来指定是否开启工作进程。
worker_processes:用于配置Nginx生成工作进程的数量,这个是Nginx 服务器实现并发处理服务的关键所在。
理论上来说workder process的 值越大,可以支持的并发处理量也越多,但事实上这个值的设定是需要 受到来自服务器自身的限制,建议将该值和服务器CPU的内核数保存一 致。
默认值为auto
- 其他指令
daemon:设定Nginx是否以守护进程的方式启动。 守护式进程是linux后台执行的一种服务进程,特点是独立于控制终端, 不会随着终端关闭而停止。
pid:用来配置Nginx当前master进程的进程号ID存储的文件路径。
该属性可以通过 ./configure –pid-path=PATH 来指定
error_log:用来配置Nginx的错误日志存放路径
该属性可以通过 ./configure --error-log-path=PATH
来指定
其中日志级别的值有:
debug|info|notice|warn|error|crit|alert|emerg,翻译过来为试|信 息|通知|警告|错误|临界|警报|紧急,这块建议大家设置的时候不要设 置成info以下的等级,因为会带来大量的磁盘I/O消耗,影响Nginx的性 能。
include:用来引入其他配置文件,使Nginx的配置更加灵活(无默认值)
events块
主要设置,Nginx服务器与用户的网络连接,这一部分对 Nginx服务器的性能影响较大
- accept_mutex:用来设置Nginx网络连接序列化
这个配置主要可以用来解决常说的”惊群”问题。大致意思是在某一个时 刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也 就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以 获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接 进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。
- multi_accept:用来设置是否允许同时接收多个网络连接
如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的 连接。否则,一个工作进程可以同时接受所有的新连接
- worker_connections:用来配置单个worker进程最大的连接数
这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能 的连接数。 另外,number值不能大于操作系统支持打开的最大文件句柄数量
- use:用来设置Nginx服务器选择哪种事件驱动来处理网络消息。
注意:此处所选择事件处理模型是Nginx优化部分的一个重要内容, method的可选值有select/poll/epoll/kqueue等
另外这些值的选择,我们也可以在编译的时候使用 --with-select_module
、--without-select_module
、--with-poll_module
、 --without-poll_module
来设置是否需要将对应 的事件驱动模块编译到Nginx的内核。
Http块
是Nginx服务器配置中的重要部分,代理、缓存、日志记录、 第三方模块配置…
- 首先, 定义mime.type
我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的 文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME Type。所以说MIME Type是网络资源的媒体类型。Nginx作为web服务 器,也需要能够识别前端请求的资源类型。
1 | include mime.types; |
如果请求内容非常简单,那么我们可以自定义响应内容
1 | location /get_text { |
- 自定义日志
Nginx中日志的类型分access.log、error.log。
- access.log:用来记录用户所有的访问请求。
- error.log:记录nginx本身运行时的错误信息,不会记录用户的访问请 求。
Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要使 用到两个指令,分别是access_log和log_format指令。
实例:
修改access.log
error.log也是类似的使用方法
- 其他配置指令
- sendfile:用来设置Nginx服务器是否使用sendfile()传输文件,该属 性可以大大提高Nginx处理静态资源的性能
- keepalive_timeout:用来设置长连接的超时时间。
- keepalive_requests:用来设置一个keep-alive连接使用的次数。
注意事项:
对于这些配置信息, 可以在很对地方进行配置, 比如server块、location块、http块等等。 但是他到底会输出哪个呢?
日志打印遵循就近原则,他会找离他最近的配置来遵循
如果在location中有,那么就按照location块的来, 如果没有那么按照上一级server的来