nginx

170 阅读2分钟

反向代理

客户知道代理服务器,但不知道实际服务器,因此客户对于实际服务器的变动是无感知的

负载均衡的模式

  1. 轮询
  2. 权重
  3. hash $request_uri
  4. ip_hash(用于解决session集群共享的问题,现在一般用redis来解决)
  5. least_conn 最少连接数法

linux下手动安装nginx

  1. nginx安装包下载地址
  2. 放到根目录下进行解压 tar -zxvf xxxx.tar.gz
  3. 进入nginx目录,执行./configure
  4. 执行make
  5. 执行make install

docker安装nginx

nginx命令

  1. ./nginx 启动
  2. ./nginx -s stop 暂停,直接关闭worker子进程
  3. ./nginx -s quit 安全退出,等待worker子进程执行完成再退出
  4. ./nginx -s reload 重启
  5. ./nginx -t 检查
  6. ps -ef | grep nginx 查看nginx进程
  7. ps aux | grep nginx 查看nginx进程

场景1:虚拟主机

多ip

多端口

多域名

虚拟主机主要有三种形式:多ip、多端口、多域名

   server {
       # 1.多ip,listen不同网卡的ip,端口可相同
       listen 8000;
       server_name 127.0.0.1;
       
       listen 8000;
       server_name 127.0.0.2;
       
       # 2.多端口,listen不同的端口,本地内网一般用这个
       listen 8001;
       server_name localhost;
       
       listen 8002;
       server_name localhost;
       
       # 3.多域名,listen不同的域名,端口可相同,公网一般用这个
       listen 8003;
       server_name www.test1.com;
       
       listen 8003;
       server_name www.test2.com;
  
   }

一个server就是一个虚拟主机,不需要后端端口启动,需要到/etc/hosts中配置域名解析,如果其他服务器要访问,也需要到其他服务器的/etc/hosts中配置本机ip地址的域名解析

http {
    # 多域名方式:  端口相同,域名不同
    server {
        listen 8005;
        server_name www.test1.com;

        location /1 {
          return 200 "user 1 host: $host";
        }
    }

     server {
        listen 8005;
        server_name www.test2.com;

        location /1 {
          return 200 "use 2 host:  $host";
        }
    }
}

场景2:静态站点

场景3:反向代理

七层反向代理

四层反向代理

场景4:负载均衡

轮循

权重

hash $request_uri

ip_hash

least_conn 最少连接

场景5:https加密传输

场景6:文件服务器

场景7:限速(限制响应速度) limit_rate

场景8:限流

场景9:黑白名单(限制特定的IP或网段) allow deny

场景10:请求拦截,先拦截判断是否放行,比如鉴权

场景11:合并请求

nginx.conf 配置文件

  • 前提:
  1. 本地有一个接口/test
  2. 现有同一服务启动了4个端口8080/8081/8082/8083
  • 目标:
  1. 使用/v1/test,访问8080/8081,并侧重于8080,实现接口/test的调用
  2. 使用/v2/test,访问8082/8083,并侧重于8082,实现接口/test的调用
  • 用到的配置代码
  1. location /v1 location /v2
  2. rewrite
  3. proxy_pass
  4. upstream & weight 负载均衡 & 权重
  • 配置如下



#user  nobody;

# 解决通过nginx访问服务器静态资源时产生的403forbidden(Permission denied)
# 只配置user root; 会解析为user root root; -> 表示root所在组为root。
# 此时在nginx -t时会失败。
# 通过id root查询80端口对应的组(即admin),回到nginx.conf修改为 user root admin;
user root admin; 

场景2: 静态站点

可以把vue打包后的目录,放到nginx的html系统目录下,由nginx解析就可以了

   server {
      listen 80;
      server_name localhost;
      
      location / {
         root /opt/nginx/html;
         index index.html index.htm;
      }
   }

场景3: 反向代理

  1. 七层反向代理
   server {
      listen 80;
      server_name localhost;
      
      location / {
         proxy_pass https://www.baidu.com;
      }
   }
  1. 四层反向代理

Nginx除了可以代理HTTP七层流量,还可以代理TCP/UDP四层流量,核心模块strean需要在编译配置时增加"-with- stream"参数进行编译(rpm包已包含)。 配置文件如下(需写在main段中,与http同级)

# 四层反向代理
stream {
      server {
        listen 33333;
        server_name www.test1.com;

        proxy_pass 127.0.0.1:8080;
      }
 }

问题

  1. 没有stream模块,需要下载stream模块
  2. 下载stream模块需要使用yum, 没有yum
  3. yum安装时 sudo apt install yum,导致apt报错Unable to locate an executable at "/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/bin/apt" (-1)
  4. nginx无法从http转发给https,好像可以安装一个yum install -y openssl openssl-devel解决这个问题

场景4: 负载均衡

upstream 轮询 权重 hash(语句hash $request_uri;) ip_hash(语句ip_hash; 可以解决session共享的问题) 最少连接数算法(least_conn; 极端情况下会沦落为轮循算法)

nginx实现防盗链

  1. 浏览器的referer,白名单域名

nginx限流、限速

nginx合并请求