Nginx

介绍

Nginx是一个开源的、高性能的HTTP服务器和反向代理服务器。Nginx也可以作为一个IMAP/POP3/SMTP代理服务器。由于其稳定性、丰富的模块库、简洁的配置和低资源消耗,Nginx在全球范围内广受欢迎。

以下是Nginx的一些主要特性:

  1. 作为Web服务器:Nginx可以作为一个静态文件的Web服务器,也可以作为反向代理服务动态HTTP内容。

  2. 负载均衡:Nginx可以作为反向代理实现负载均衡,将接收到的请求分发到后端的多个服务器,从而提高网站的可用性和性能。

  3. HTTP和HTTPS支持:Nginx支持HTTP和HTTPS,能够实现安全的网络传输。

  4. 反向代理和缓存:Nginx能够作为反向代理,处理来自客户端的请求并将其转发到适当的服务器,并且可以缓存这些服务器的响应以提高性能。

  5. 灵活的配置:Nginx提供了灵活和强大的配置选项,使得开发者可以根据自己的需求定制Nginx服务器。

  6. 高并发连接:Nginx使用事件驱动的架构,能够处理大量并发连接,这使得Nginx在处理高流量的网站时表现出高效性。

安装

配置虚拟机环境

命令

  • tree:树形目录

  • conf 配置文件

  • html 静态文件

  • logs 日志文件

  • sbin 脚本文件 用于启动停止nginx服务

打开sbin目录

  • ./nginx -v: 检查版本号
  • ./nginx -t: 测试文件
  • ./nginx: 启动Nginx(不要忘记关闭防火墙 systemctl stop firewalld
  • ./nginx -s stop: 关闭Nginx服务
  • ./nginx -s reload: 重新加载文件

需要在etc/profile中加入nginx的环境变量,就不用像前面那样麻烦配置

配置文件

    • 全局块

      • 和nginx有关的全局配置
    • events块

      • 和网络连接的有关配置
    • http块 代理,缓存,日志记录,虚拟主机

      • http 全局块

      • server块

        • server全局块

        • location块

  1. 全局块:

    • 描述:全局块包含整个 Nginx 配置的全局设置,涉及 Nginx 服务器的全局性质的配置项。
    • 例子:
      user nginx;
      worker_processes auto;
      error_log /var/log/nginx/error.log info;
  2. events块:

    • 描述:events 块包含与网络连接和事件相关的配置,主要控制 Nginx 如何处理连接和事件。
    • 例子:
      events {
      worker_connections 1024;
      use epoll;
      multi_accept on;
      }
  3. http块:

    • 描述:http 块包含与 HTTP 协议相关的配置,包括代理、缓存、日志记录、虚拟主机等。
    • 例子:
      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;
      tcp_nodelay on;
  4. http 全局块:

    • 描述:http 全局块包含 HTTP 配置的全局性质的设置。
    • 例子:
      http {
      ...
      server_tokens off;
      proxy_buffering on;
      gzip on;
      ...
      }
  5. server块:

    • 描述:server 块定义一个虚拟服务器配置,包括监听的端口、域名等。
    • 例子:
      server {
      listen 80;
      server_name example.com;

      location / {
      root /var/www/html;
      index index.html;
      }
      }
  6. server全局块:

    • 描述:server 全局块包含 server 配置的全局性质的设置。
    • 例子:
      server {
      ...
      ssl_certificate /etc/nginx/ssl/server.crt;
      ssl_certificate_key /etc/nginx/ssl/server.key;
      ...
      }
  7. location块:

    • 描述:location 块用于匹配特定的请求 URI,并定义了如何处理这些请求。
    • 例子:
      location /images/ {
      alias /var/www/images/;
      }

      location ~ \.php$ {
      fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      }

部署静态资源

nginx 相对于tomcat 更加高效

server {
listen 80;
server_name localhost;

location / {
root html; # 识别一个叫做html的目录
index index.html index.htm; # 默认打开index.html文件
}

反向代理

用户不需要知道目标服务器的地址,也无须再客户端做任何设定

正向代理

用户知道目标服务器,通过代理服务器访问目标服务器

区别

正向代理(Forward Proxy)和反向代理(Reverse Proxy)是两种常见的代理服务器的使用方式,它们主要的区别在于代理服务器是代理客户端(用户)还是代理服务器(网站或应用)。

  1. 正向代理:正向代理位于客户端和原始服务器(目标服务器)之间,客户端将请求发送到代理服务器,然后代理服务器将请求转发到目标服务器,并将目标服务器的响应返回给客户端。在这种情况下,代理服务器代理的是客户端,这对于访问某些客户端无法直接访问的服务器(例如,由于地理限制或网络封锁)非常有用。正向代理还可以用于缓存,减少带宽使用,或保护客户端的隐私。

  2. 反向代理:反向代理位于客户端和一组原始服务器之间,客户端将请求发送到代理服务器,然后代理服务器将请求转发到其中的一个或多个原始服务器,并将这些服务器的响应返回给客户端。在这种情况下,代理服务器代理的是服务器,这通常用于负载均衡,SSL终止,或者提高应用的安全性。

总结一下,正向代理代理的是客户端,用户知道代理的存在,并且主动使用代理访问服务器。反向代理代理的是服务器,客户端通常不知道代理的存在,认为自己是直接与服务器通信的。

操作

需要2台服务器

配置反向代理:

server{
listen 82;
server_name localhost;
location/{
rewrite ^/(.)$ /$1 break; # 对请求进行重写,把斜杠后面的内容作为参数传递给后端
proxy_pass http://192.168.138.101:8080; # 反向代理设置,把请求转发到指定服务
}
}
  • rewrite ^/(.)$ /$1 break; 重写url,去掉前面的/,否则会报404错误

负载均衡

  • 应用集群:把同一个应用部署到多台服务器上面,组成集群,接收负载均衡器分发的请求
  • 负载均衡器:把用户请求根据对应的负载均衡算法分发到应用集群中的一台服务器进行处理
http {
upstream backend { # 定义一组服务器
# 使用轮询算法:以循环的方式询问下面服务器
# weight 表示权重
server backend1.example.com weight=10;
server backend2.example.com weight=5;
}
server {
listen 80;
server_name localhost;
location / {
# 反向代理
proxy_pass https://backend;
}
}
}

负载均衡策略是用来决定网络流量如何在多个服务器上分发的规则或算法。下面是一些常见的负载均衡策略:

  1. 轮询(Round Robin):这是最简单的负载均衡策略,每个新的请求都发送到下一个服务器。如果服务器列表是A、B、C,那么第一个请求将发送到A,第二个请求发送到B,第三个请求发送到C,第四个请求发送到A,以此类推。
  2. 最少连接(Least Connections):在这种策略下,新的请求会发送到当前连接数最少的服务器。如果服务器A有10个活跃连接,服务器B有5个活跃连接,服务器C有7个活跃连接,那么新的请求将会发送到服务器B。
  3. IP Hash:这种策略使用客户端IP地址的哈希值来决定请求应发送到哪个服务器。这样,来自同一IP地址的所有请求都将发送到同一服务器,除非该服务器不可用。
  4. 权重轮询(Weighted Round Robin):这是轮询策略的改进版本。每个服务器都被分配了一个权重,权重大的服务器会处理更多的请求。
  • 例如,如果服务器A的权重是3,B的权重是2,C的权重是1,那么在6个请求中,A会处理3个,B处理2个,C处理1个。
  1. 权重最少连接(Weighted Least Connections):这是最少连接策略的改进版本。和权重轮询类似,每个服务器都被分配了一个权重,但新的请求会发送到连接数/权重最小的服务器。
  2. URL Hash:该策略将根据请求URL的哈希结果将请求分发到不同的服务器,所有请求同一URL的请求都会被路由到同一台服务器。这对于保证某些类型的数据局部性非常有用。
    这些负载均衡策略都有各自的优点和缺点,选择哪一种策略取决于你的特定需求和应用场景。