【nginx】

@


写在前面


nginx

静态

配置文件位于 /etc/nginx/nginx.conf , 下列命令会引用/etc/nginx/conf.d目录下所有的.conf文件,这样可以保持主配置文件的简洁,同时配个多个.conf文件方便区分,增加可读性。

include /etc/nginx/conf.d/*.conf;
server {
    listen       80; #监听端口
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html; #根目录
        index  index.html index.htm; #首页
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

框架

#HTTP代理
http {
  server {
    listen 8002;
    proxy_pass http://localhost:8080/;
  }
}

#TCP代理
stream {
  server {
    listen 13306;
    proxy_pass localhost:3306;
  }
}

本地文件

  • listen
    监听可以配置成IP或端口或IP+端口
    listen 127.0.0.1:8000;
    listen 127.0.0.1;( 端口不写,默认80 )
    listen 8000;
    listen *:8000;
    listen localhost:8000;

  • server_name
    server_name主要用于区分,可以随便起。
    也可以使用变量 $hostname 配置成主机名。
    或者配置成域名: example.org www.example.org *.example.org
    如果多个server的端口重复,那么根据域名或者主机名去匹配 server_name 进行选择。
    下面的例子中:
    curl http://localhost:80会访问/usr/share/nginx/html
    curl http://nginx-dev:80会访问/home/AdminLTE-3.2.0

# curl http://localhost:80 会访问这个
server {
    listen       80;
    server_name  localhost;

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

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

 # curl http://nginx-dev:80 会访问这个
server{
    listen 80;
    server_name nginx-dev;#主机名
    
    location / {
        root /home/AdminLTE-3.2.0;
        index index.html index2.html index3.html;
    }
  
}

反向代理

  • 常用变量的值:
    • $host:nginx主机IP,例如192.168.56.105
    • $http_host:nginx主机IP和端口,192.168.56.105:8001
    • $proxy_host:localhost:8088,proxy_pass里配置的主机名和端口
    • $remote_addr:用户的真实IP,即客户端IP。
  • 非HTTP代理
    如果要将请求传递到非 HTTP 代理服务器,可以使用下列指令:
    • fastcgi_pass 将请求转发到FastCGI服务器(多用于PHP)
    • scgi_pass 将请求转发到SCGI server服务器(多用于PHP)
    • uwsgi_pass 将请求转发到uwsgi服务器(多用于python)
    • memcached_pass 将请求转发到memcached服务器

参考

location /some/path/ {
    #nginx的主机地址
    proxy_set_header Host $http_host;
    #用户端真实的IP,即客户端IP
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_pass http://localhost:8088;
}

修饰符

  • location 修饰符
    location可以使用修饰符或正则表达式
    修饰符:
    = 等于,严格匹配 ,匹配优先级最高。
    ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。优先级第二高。
    ~ 区分大小写
    ~* 不区分大小写
  • 优先级
    优先级从高到低依次为:。
    1. 精确匹配(=)
    2. 前缀匹配(^~)
    3. 正则匹配(~和~*)
    4. 不写
server{


  location / {
    proxy_pass http://localhost:8080/;
  }
  
  location = /html/ie.html {
    root  /home/www/static;
  }
  
  location ^~ /fonts/ {
   
    root  /home/www/static;
  }
  
  location ~ \.(css|js|png|jpg|gif|ico) {
    root /home/www/static;
}

缓冲(buffer)和缓存(cache)

  • 缓冲

    • proxy_max_temp_file_size‎‎设置临时文件的最大值。
    • proxy_temp_file_write_size‎‎设置一次写入临时文件的大小。
  • 缓存

    • proxy_cache_path 设置缓存本地文件目录名称大小
    • proxy_cache_valid 缓存超过最大配置大小时,按照时间删除最旧的数据。
    • proxy_cache_key "\(host\)request_uri$cookie_user"; 自定义缓存键
proxy_cache_path /var/cache/nginx/data keys_zone=mycache:10m; # 定义缓存的本地文件目录,名称和大小

server {

    listen 8001;
    server_name ruoyi.localhost;
    
    location / {
        #设置buffer
        proxy_buffers 16 4k;
        proxy_buffer_size 2k;
        proxy_pass http://localhost:8088;
    }

    location ~ \.(js|css|png|jpg|gif|ico) {
        #设置cache
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any 5m;
        proxy_pass http://localhost:8088;
    }

    location = /html/ie.html {
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any 5m;
        proxy_pass http://localhost:8088;  
    }

    location ^~ /fonts/ {
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any 5m;
        proxy_pass http://localhost:8088;  
    }

}

负载均衡

  1. 轮循机制(round-robin)
    默认机制,以轮循机制方式分发。

  2. 最小连接(least-connected )
    将下一个请求分配给活动连接数最少的服务器(较为空闲的服务器)。

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}
  1. ip-hash
    客户端的 IP 地址将用作哈希键,来自同一个ip的请求会被转发到相同的服务器。
    此方法可确保来自同一客户端的请求将始终定向到同一服务器,除非此服务器不可用。
upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}
  1. hash
    通用hash,允许用户自定义hash的key,key可以是字符串、变量或组合。
    例如,key可以是配对的源 IP 地址和端口,也可以是 URI,如以下示例所示:
    请注意:基于 IP 的哈希算法存在一个问题,那就是当有一个上游服务器宕机或者扩容的时候,会引发大量的路由变更,进而引发连锁反应,导致大量缓存失效等问题。
upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

5.‎随机‎‎ (random)
每个请求都将传递到随机选择的服务器。
two是可选参数,NGINX 在考虑服务器权重的情况下随机选择两台服务器,然后使用指定的方法选择其中一台,默认为选择连接数最少(least_conn‎)的服务器。

upstream backend {
    random two least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}
  1. 权重(weight)
    每 5 个新请求将按如下方式分布在应用程序实例中:3 个请求将定向到performance.server,一个请求将转到app1.server,另一个请求将转到app2.server。
upstream my-server {
  
    server performance.server weight=3;
    server app1.server;
    server app2.server;

}

7.健康检查
在反向代理中,如果后端服务器在某个周期内响应失败次数超过规定值,nginx会将此服务器标记为失败,并在之后的一个周期不再将请求发送给这台服务器。‎
通过fail_timeout‎‎ 来设置检查周期,默认为10秒。
通过max_fails‎来设置检查失败次数,默认为1次。‎
‎在以下示例中,如果NGINX无法向服务器发送请求或在30秒内请求失败次数超过3次,则会将服务器标记为不可用30秒。

upstream backend {
  server backend1.example.com;
  server backend2.example.com max_fails=3 fail_timeout=30s; 
} 

https

HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。

  • 生成证书
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
  • ssl 配置
server {
    listen              443 ssl;
    server_name         ruoyi.https;
    ssl_certificate     /home/ssl/server.crt;
    ssl_certificate_key /home/ssl/server.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
	ssl_password_file   /home/ssl/cert.pass;  # 密码
  
    location / {
        proxy_pass http://localhost:8088;
    }
}

参考资料


posted @ 2023-11-21 11:10  Nones  阅读(4)  评论(0编辑  收藏  举报