正向代理和反向代理的区别

简而言之,正向代理隐藏的是客户端,服务于客户端,而反向代理隐藏的是服务器,服务于服务器。

正向代理

  • 服务对象:正向代理的服务对象是客户端。它允许客户端通过代理来访问互联网上的资源。正向代理代表客户端去获取信息。
  • 使用场景:常用于客户端绕过网络限制(比如访问地理上受限的网站)、进行匿名访问、或在客户端和互联网之间提供缓存服务。
  • 工作方式:客户端配置代理服务器,当客户端发送请求时,请求首先发送到正向代理服务器,然后代理服务器代表客户端向目标服务器发送请求,获取资源后再转发给客户端。

反向代理

  • 服务对象:反向代理的服务对象是服务端。它接收互联网上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给互联网上请求连接的客户端。
  • 使用场景:常用于负载均衡、加密和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目录

  1. 配置目录 (/etc/nginx/):

    • 这是 Nginx 的主要配置目录。它包含了 Nginx 的主配置文件 nginx.conf 和其他可选的配置文件。

    • nginx.conf 是 Nginx 服务器的主配置文件,用于控制 Nginx 的全局设置。

    • 通常还包括 sites-availablesites-enabled 子目录,用于存放单独的网站配置文件。sites-available 包含可用的网站配置,而 sites-enabled 通常包含指向 sites-available 中实际启用的网站配置的链接。

    • conf/: 这是配置文件目录,存放Nginx的配置文件。

      • fastcgi.conffastcgi_params: 这两个文件与fastcgi协议相关的参数配置,通常用于优化与fastcgi进程(如PHP-FPM)的交互。
      • koi-utfkoi-win: 这些是字符集映射表文件,用于在koi8-r和其他字符集之间进行转换。
      • mime.types: 用于设置Nginx中不同文件类型的MIME类型。
      • nginx.conf: 这是Nginx的主配置文件,用于定义服务器的工作模式以及各种类型的设置。
      • scgi_params: 用于配置与SCGI协议相关的参数。
      • uwsgi_params: 用于配置与uWSGI服务器交互的参数。
      • win-utf: 用于字符集转换的配置文件。
  2. 日志目录 (/var/log/nginx/):

    • 存放 Nginx 的日志文件,包括访问日志 (access.log) 和错误日志 (error.log)。
    • 访问日志记录了所有的客户端请求,而错误日志记录了服务器运行中的错误信息。
  3. HTML 目录 (/usr/share/nginx/html//var/www/html/):

    • 这是 Nginx 的默认文档根目录,用于存放网站的静态文件,如 HTML 文件、图片等。
    • 在默认配置中,当访问服务器的根 URL 时,Nginx 会从这个目录中提供内容。
  4. 可执行文件目录 (/usr/sbin/nginx):

    • 这里存放的是 Nginx 服务器的可执行文件(二进制可执行文件)。
    • 通过这个文件,可以启动、停止、重载 Nginx 配置等。
  5. 系统库目录 (/var/lib/nginx/):

    • 用于存放与 Nginx 运行相关的文件,如临时文件和缓存。
  6. 客户端体积限制目录 (/var/cache/nginx/):

    • 当启用代理缓存或快速CGI缓存时,缓存的内容会存储在这个目录下。

Nginx服务的信号控制

方式一:Nginx服务的信号控制

1
2
3
4
5
ginx中的master和worker进程? 
Nginx的工作方式?
如何获取进程的PID?
信号有哪些?
如何通过信号控制Nginx的启停等相关操作?

前面在提到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

这几说明(飘`号)的作用: 它可以将飘号里面的执行完之后作为输出结果展示出来

  1. 发送TERM/INT信号给master进程,会将Nginx服务立即关闭。
1
2
3
kill -TERM PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
// `cat /usr/local/nginx/logs/nginx.pid` 获取pid, 然后展示出来
kill -INT PID / kill -INT `cat /usr/local/nginx/logs/nginx.pid`
  1. 发送QUIT信号给master进程,master进程会控制所有的work进程不 再接收新的请求,等所有请求处理完后,在把进程都关闭掉。
1
kill -QUIT PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
  1. 发送HUP信号给master进程,master进程会把控制旧的work进程不 再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根 据nginx的配置文件重新启动新的work进程
1
kill -HUP PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
  1. 发送USR1信号给master进程,告诉Nginx重新开启日志文件
1
kill -USR1 PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
  1. 发送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
2
kill -USR2 PID / kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
kill -QUIT PID / kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

发送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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
user  nginx;  
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;
keepalive_timeout 65;

#gzip on;
include /etc/nginx/conf.d/*.conf;
}

配置文件结构

Nginx的配置文件默认主要分为三大块: events块、http块、以及之外的就被成为全局块。

http块中可以配置多个server块,每个server块又可以配置多个location 块。

下面我们来简单介绍一下三大块

全局块

全局块,主要设置Nginx服务器整体运行的配置指令

  1. 全局块中的user指令

这里的user就是我们使用的系统的user, 以Ubuntu为例。 使用root用户, 那么配置的用户和用户组都是root, 如果我们这里配置的用户为rayce, 那么配置文件的所属用户和用户组都是rayce,如果不使用user命令来改变对应的用户, 那么就会出现权限问题

user指令用于指定Nginx工作进程运行的用户以及用户组。这个指令决定了Nginx服务器进程执行的系统权限级别。 这里我们最好不要设置为root用户。

当然如果我们随意的修改user后面的用户, 那么还需要修改location中的html页面对应的地址, 否则就会报错。

  1. 全局块中的work process指令(工作进程相关的指令)

master_process:用来指定是否开启工作进程。

worker_processes:用于配置Nginx生成工作进程的数量,这个是Nginx 服务器实现并发处理服务的关键所在。

理论上来说workder process的 值越大,可以支持的并发处理量也越多,但事实上这个值的设定是需要 受到来自服务器自身的限制,建议将该值和服务器CPU的内核数保存一 致。

默认值为auto

  1. 其他指令

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服务器的性能影响较大

  1. accept_mutex:用来设置Nginx网络连接序列化

这个配置主要可以用来解决常说的”惊群”问题。大致意思是在某一个时 刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也 就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以 获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接 进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。

  1. multi_accept:用来设置是否允许同时接收多个网络连接

如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的 连接。否则,一个工作进程可以同时接受所有的新连接

  1. worker_connections:用来配置单个worker进程最大的连接数

这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能 的连接数。 另外,number值不能大于操作系统支持打开的最大文件句柄数量

  1. use:用来设置Nginx服务器选择哪种事件驱动来处理网络消息。

注意:此处所选择事件处理模型是Nginx优化部分的一个重要内容, method的可选值有select/poll/epoll/kqueue等

另外这些值的选择,我们也可以在编译的时候使用 --with-select_module--without-select_module--with-poll_module--without-poll_module 来设置是否需要将对应 的事件驱动模块编译到Nginx的内核。

Http块

是Nginx服务器配置中的重要部分,代理、缓存、日志记录、 第三方模块配置…

  1. 首先, 定义mime.type

我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的 文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME Type。所以说MIME Type是网络资源的媒体类型。Nginx作为web服务 器,也需要能够识别前端请求的资源类型。

1
2
include mime.types;
default_type application/octet-stream;

如果请求内容非常简单,那么我们可以自定义响应内容

1
2
3
4
5
6
7
8
9
10
location /get_text { 
#这里也可以设置成
text/plain default_type text/html;
return 200 "This is nginx's text";
}

location /get_json{
default_type application/json;
return 200 '{"name":"TOM","age":18}';
}
  1. 自定义日志

Nginx中日志的类型分access.log、error.log。

  • access.log:用来记录用户所有的访问请求。
  • error.log:记录nginx本身运行时的错误信息,不会记录用户的访问请 求。

Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要使 用到两个指令,分别是access_log和log_format指令。

实例:

修改access.log

error.log也是类似的使用方法

  1. 其他配置指令
  • sendfile:用来设置Nginx服务器是否使用sendfile()传输文件,该属 性可以大大提高Nginx处理静态资源的性能

  • keepalive_timeout:用来设置长连接的超时时间。

  • keepalive_requests:用来设置一个keep-alive连接使用的次数。

注意事项:

对于这些配置信息, 可以在很对地方进行配置, 比如server块、location块、http块等等。 但是他到底会输出哪个呢?

日志打印遵循就近原则,他会找离他最近的配置来遵循

如果在location中有,那么就按照location块的来, 如果没有那么按照上一级server的来