NGINX的配置和基本使用

Linux NGINX

NGINX:engine X ,2002年开发,分为社区版和商业版(nginx plus )
社区版:分为主线版(开发版,奇数),稳定版(偶数)

Nginx官网:http://nginx.org
NGINX的两大功能:web服务器、反向代理服务器

NGINX和APACHE一样,也是基于模块设计的,使用不同的模块可以实现不同的功能。模块只能静态编译、不能动态加载。

NGINX的架构:一个主进程,若干个子进程。
主进程:接收用户的请求,转发用户请求、监控子进程

子进程:为用户提供服务(真正工作的进程),子进程数量一般设置为cpu的核心数
NGINX的安装:

编译安装:下载源码包进行编译安装

源码包地址:http://nginx.org/en/download.html

案例地址:https://www.cnblogs.com/heyongshen/p/16854271.html

源安装:centos 8和ubuntu 1804仓库中默认带的nginx版本是1.14版本

源下载地址:http://nginx.org/en/linux_packages.html

NGINX的相关参数:

-v 查看版本信息  -V 显示更详细的信息,包括编译参数
-t nginx配置文件语法检查
-c 找到nginx的配置文件
-e 指定错误日志
-g 指定指令,使用自己指定的指令来替代配置文件的指令
    例如:nginx配置文件里面的 user nginx; 可以不写在配置文件里面,而是通过nginx -g "user nginx" 来指定。
-s 发送信号,stop、reload等信号

启动NGINX:

可以通过编写systemd的unit文件来交给systemd托管,使用systemctl命令启动

通过NGINX自身的命令来启动:

# 启动nginx  nginx 默认就是后台执行
# nginx

说明:如果使用unit文件的方式来托管NGINX,那么不可以在使用nginx自身的命令来启动,会冲突。

NGINX的信号管理:

可以通过ngins -s 给nginx发送指令,从而管理nginx。

kill命令的使用参考:https://www.cnblogs.com/heyongshen/p/16854476.html

#nginx信号控制使用的几个选项

stop       立刻停止服务,相当于信号SIGTERM,SIGINT

quit       优雅的停止服务,相当于信号SIGQUIT

reload     重新加载配置文件,重新生成worker进程,master进程不变,相当于信号SIGHUP

reopen     重新开始记录日志文件,在切割日志时用途较大。相当于信号SIGUSR1

SIGUSR2    平滑升级可执行程序

SIGWINCH   优雅的停止工作进程

说明:

USER1 USER2,作为用户自定义信号,程序可以自定义这2个信号的含义,在收到这2个信号的时候,可以自定义代码进行对着2个信号的处理,nginx的SIGUSR1和SIGUSR2分别代表切割日志与平滑升级。

NGINX的平滑升级和回滚:

NGINX的平滑升级

#实现过程
1.下载并解压源码包 tar -xzf nginx-1.22.1.tar.gz

2.查看原来的编译选项,使用原有编译选项源码编译新版nginx  nginx -V
./configure --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --prefix=/apps/nginx

3.执行make进行编译,不执行make install,因为会将旧版本就行覆盖 make -j 4 

4.备份旧版本 mv old_file{,.bak}

5.将编译的新版本移动到指定的位置(旧版本所在的位置) cp -a nginx /apps/nginx/sbin/

6.检查新版本的nginx是否正常 nginx -t

7.发送user2信号进行平滑升级(此时两个master共存)kill -USR2 cat /apps/nginx/run/nginx.pid
旧版本主进程PID的文件重命名为nginx.pid.oldbin

8.给旧的进程发送信号,关闭老的worker  kill -QUIT cat /apps/nginx/run/nginx.pid.oldbin
#先关闭旧nginx的worker进程,而不关闭nginx主进程方便回滚

9.#经过一段时间测试,新版本服务没问题,最后退出老的master  kill -QUIT cat /apps/nginx/run/nginx.pid.oldbin

# 回滚:
#如果升级的版本发现问题需要回滚,可以重新拉起旧版本的worker
kill -HUP cat /apps/nginx/run/nginx.pid.oldbin

#最后关闭新版的master
kill -QUIT cat /apps/nginx/run/nginx.pid

#移除新版本的nginx,将旧版本的nginx重新命名为nginx,并检查
rm -f nginx ; mv nginx.bak nginx;
#升级nginx
usr2-->winch-->quit--->hub
备份旧版本、将新版本放到nginx正常的安装路径 -- 此时现在系统中运行的仍然是旧版本

进行语法检查,看新版本的nginx是否能正常加载系统中的配置文件

#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
#旧master是新master的父进程
发送usr2信号给旧版本nginx,此时新的nginx会生成新的master和worker,新旧进程的master和worker共存(此时虽然新旧进程都在监听80端口,但是只有新的master才会接收用户的请求。)

#先关闭旧nginx的worker进程,而不关闭nginx主进程方便回滚
优雅关闭旧的worker进程(WINCH信号),逐步关闭worker进程,主进程不退出 。此时就进程的进程编号文件xxx.oldbin

#测试一段时间后,新版本没问题,就可以关闭旧nginx的master进程。
发送QUIT信号可以推出master进程

#此时如果新版本有问题旧可以回滚:因为旧master的父进程没有关闭
通过给旧nginx发送HUP信号重新加载配置文件,重新生成worker进程

#旧master恢复后,关闭新nginx的master进程

NGINX的配置:

nginx的配置文件中,每一个配置都要以分号结尾。

全局配置:

user:指定启动和运行nginx服务的用户
    例如:user nginx #指定运行nginx的用户为nginx

worker_processes:设置nginx的worker进程,建议设置为和cpu核心数一样
    例如:worker_processes auto #表明会根据cpu的核心数来指定nginx的worker进程数量

pid:指定nginx服务的pid文件所在位置
    例如:pid   run/nginx.pid;  #指定nginx的pid文件存放位置为  安装目录/run/nginx.pid  相对路径,相对于安装目录

include:配置文件
    例如;include /usr/share/nginx/modules/*.conf;
error_log:指定错误日志的路径
    例如:error_log /var/log/nginx/error.log;

worker_cpu_affinity:设置nginx的亲和性,让worker进程在固定的cpu上运行,较少了worker进程在cpu之间的来回跳转。
    例如:worker_cpu_affinity 1000 0100 0010 0001; #本机有四个cpu,0001代表第一个cpu,0010 代表第二个cpu。。。。每个cpu绑定一个worker进程。 

设置客户端连接nginx服务器的相关参数:events

events设置块主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。

events:设置客户端连接nginx服务器的相关参数
    例如:events {
             worker_connections  1024;  #表示单个worker进程支持的最大并发是1024
         }

location指令块配置:location指令块主要是对用户请求的url进行匹配,并作对应的处理。

location:用户请求的url匹配;对匹配到的url作对应处理;包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的配置也是在location模块中配置。

location / {   #当用户访问网站根的时候,就访问html这个目录
            root   html;  #root 根,相对路径
            index  index.html index.htm; #指定默认的显示页面
        }

#location实现精确匹配         = 表示精确匹配
location = /logo.jpg {   #表示uri必须是logo.jpg才会匹配到
   root /data/nginx/images;
   index index.html;
 }

 #                          ~ 实现区分大小写的模糊匹配.
location ~ /A.?.jpg { #匹配字母A开头的jpg图片,后面?表示A后面零次或一个字符 例如:Ax.jpg
   index index.html;
   root /data/nginx/html/image;
}

#                             ~*  不区分大小写
location ~* /A.?.jpg {
   index index.html;
   root /opt/nginx/html/image;
 }

#                               以什么z
location ^~ /images { #必须要以images作为开始的才匹配,不区分大小写
   root /data/nginx/;
   index index.html;
 }

说明:
=         标识精确匹配,大小写敏感
^~        不区分大小写,以xx作为开头
~         包含正则表达式,区分大小写
~*        包含正则表达式,不区分大小写
         转移字符(逃脱符) 包含xx内容就匹配
无符号:   标识起始于的意思

优先级:
=, ^~, ~/~*, 不带符号

location指令块中的相关指令说明:

root 指定web的家目录 文件的绝对路径等于 root+location

alias:定义路径别名,会把访问的路径重新定义到其指定的路径(alias只能放在location中)

index:#指定默认的显示页面
    例如:index  index.html index.htm; 多个页面空格分隔

# root和alis的区别:
    root:指定用户的根目录,用户访问的路径:root+location
    alis:重定向,把访问的路径重新定义到其指定的路径。访问路径:alis

例如:
server{
    listen  80;                      
    server_name  www.yongshen.com;   
    location  /xx { 
       #表明访问的就是根下面的xx使用root指定了根为/data/nginx/html/pc所以访问的完整路径:/data/nginx/html/pc/xx
      index index.html            
      root /data/nginx/html/pc;   #用户访问的路径:/data/nginx/html/pc/xx(把location中的/替换为root)
    }
}

server{
    listen  80;                     
    server_name  www.yongshen.com;  
    location  /xx {                   
      index index.html               
      alias /data/nginx/html/pc;  # 用户访问的路径:用户访问/xx时,就显示/data/nginx/html/pc中的数据信息。
    }
}

http指令块:

http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,http块可以包含多个server块,而一个server块中又可以包含多个location块

http {

    server {

       location {     

        }   
    }
}

listen:配置nginx的监听端口
    例如:listen 80; #表示nginx服务监听本机所有ip地址的80端口

server_name:设置主机的名称
    例如:server_name www.yongshen.com #设置本服务器的名称为www.yongshen.com

例如:

http {  #主要是实现web服务器的相关配置
    include       mime.types;                #包含的文件类型
    default_type  application/octet-stream;  #默认类型,如果该文件不在 mime.types中被定义,那么他就是default类型  
    include conf.d/*.conf;                   #包含子配置文件,相对路径,以为conf目录为起点
    sendfile        on;
    keepalive_timeout  65;
}

# 子配置文件
# web的配置
[root@CentOS8 conf.d]# cat pc.conf 
server{
    listen  80;                      #监听的端口,不指定ip默认监听所有网卡的80端口
    server_name  www.yongshen.com;   #虚拟主机的网站名称
    location  / {                    #实现从uri到文件系统的路径映射 /表示的就是默认的资源存放位置
      index index.html               #指定默认打开的网页
      root /data/nginx/html/pc;      #指定web的家目录 文件的绝对路径等于 root+location
    }
}

MIME相关知识点

mime:多用途互联网邮件扩展类型,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。

多媒体概念:

媒体是传播信息的媒介,实现将信息源传递到受信者得一种手段,例如图像、声音、文字等
多媒体:多种媒体的综合,例如图像、声音、文字、视频等媒体就可以统称为多媒体
最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。

客户端接收到服务器返回来的数据后,根据mime标识的数据类型来解析不同类型的数据。

每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
主类型/次要类型                 文件后缀
text/html:HTML 格式的文本文档
text/plain:普通的 ASCII 文本文档
image/jpeg:JPEG格式的图片
image/gif:GIF格式的图片
video/quicktime:Apple 的 QuickTime 电影
application/vnd.ms-powerpoint:微软的powerpoint文件

范例:使用nginx搭建一个web站点

[root@HAproxy ~]# cat /etc/nginx/nginx.conf | grep -E -v '^#|^$' 
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    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;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server { 
       listen 80 default_server;
       server_name yongshen.com;
       location / {
          root  /usr/share/nginx/html;
          index index.html index.htm;
        }

     }
}

NGINX的HTTPS功能的实现:https = http+ssl或者https = http+tls

https的工作流程:

1.客户端发起请求

2.服务端将自己的公钥文件发送给客户端

3.客户端检验公钥的合法性(通过根CA来校验证书的合法性,因为服务器的证书就是根CA颁发的)

4.客户端用这个公钥加密一个随机数发送给服务端

5.服务端用自己的私钥解析这个加密的信息(客户端和服务端的通信就可以通过这个随机值进行加密解密了)

6.信息传输:把数据通过这个随机值来进行对称加密

NGINX实现https的配置:

nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编译安装的nginx需要指定编译参数--with-http_ssl_module开启

实现步骤:

(1)生成服务器的私钥和证书,CA的证书

# 脚本
CA_SUBJECT="/O=magedu/CN=ca.magedu.org"
SUBJECT="/C=CN/ST=henan/L=zhengzhou/O=magedu/CN=www.magedu.org"
SERIAL=34
EXPIRE=202002
FILE=magedu.org

openssl req  -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crt

openssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key  -subj $SUBJECT -out ${FILE}.csr

openssl x509 -req -in ${FILE}.csr  -CA ca.crt -CAkey ca.key -set_serial $SERIAL  -days $EXPIRE -out ${FILE}.crt

chmod 600 ${FILE}.key ca.key

#说明:
公用名称 (Common Name) 简称:CN 字段,对于 SSL 证书,一般为网站域名或IP地址;
单位名称 (Organization Name) :简称:O 字段,对于 SSL 证书,一般为网站域名;

# 证书申请单位所在地: 
所在城市 (Locality) 简称:L 字段 
所在省份 (State/Provice) 简称:S 字段 
所在国家 (Country) 简称:C 字段,只能是国家字母缩写,如中国:CN 

#其他一些字段:
电子邮件 (Email) 简称:E 字段 
多个姓名字段 简称:G 字段 
介绍:Description 字段 
电话号码:Phone 字段,格式要求 + 国家区号 城市区号 电话号码,如: +86 732 88888888 
地址:STREET  字段 
邮政编码:PostalCode 字段 
显示其他内容 简称:OU 字段

(2)将服务器的证书和CA的证书,两个证书信息放在一个文件 (服务器位于CA前面)

# cat nginx.crt ca.crt > nginx.pem

(3)参数配置

server {
    listen 443 ssl; #为指定的虚拟主机配置启用ssl功能
    listen 80;
    server_name localhost;
    ssl_certificate /etc/nginx/cert/nginx.pem;  ##指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件
    ssl_certificate_key /etc/nginx/cert/nginx.key;  ##当前虚拟主机使用的私钥文件,一般是key文件
    ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];  #支持ssl协议版本,早期为ssl现在是TLS,默认为后三个
    ssl_session_cache off      #关闭ssl缓存
    ssl_session_cache shared:sslcache:20m;    #使用共享缓存 这个缓存叫做sslcache 缓存大小是20m
    ssl_session_timeout 10m;     #缓存有效时间是十分钟

    location / { #用户的url路径匹配
        root /usr/share/nginx/html;  #指定根目录
        index index.html;  #指定默认的index页面
    }

}

范例:实现nginx的https配置:

# 1. 生成证书文件
[root@HAproxy certs]# cat certs.bash 
#!/bin/bash

CA_SUBJECT="/O=nginx/CN=ca.nginx.org"
SUBJECT="/C=CN/ST=sichuan/L=cehngdu/O=ehigh/CN=www.magedu.org"
SERIAL=34
EXPIRE=202002
FILE=nginx

openssl req  -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crt

openssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key  -subj $SUBJECT -out ${FILE}.csr

openssl x509 -req -in ${FILE}.csr  -CA ca.crt -CAkey ca.key -set_serial $SERIAL  -days $EXPIRE -out ${FILE}.crt

chmod 600 ${FILE}.key ca.key
# 2. 合并证书文件
# cat nginx.crt ca.crt > nginx.pem

# 3. 相关配置
[root@HAproxy certs]# cat /etc/nginx/nginx.conf | grep -E -v '^#|^$'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    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;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server { 
       listen 80 default_server;
       listen 443 ssl;  ##表示监听443端口的ssl服务
       server_name yongshen.com;
       ssl_certificate /etc/nginx/certs/nginx.pem; ##服务器证书和他的上级证书(ca证书)
       ssl_certificate_key /etc/nginx/certs/nginx.key; #服务器的私钥
       ssl_session_cache off;   #关闭缓存
       ssl_session_cache shared:sslcache:20m;  #使用共享缓存 这个缓存叫做sslcache 缓存大小是20m
       ssl_session_timeout 10m;  #缓存有效时间是十分钟

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

   }
}
(4)测试

image-20221212001242365
说明:

# nginx实现https和apache实现https区别:
apache实现https的时候是三个文件 服务器证书 服务器私钥 证书链(上级CA的证书),nginx相当于把apache的两个文件合并成一个文件 服务器证书和CA证书

NGINX反向代理的实现:

反向代理:

正向代理:

实现nginx的反向代理配置:有很多个模块可以实现nginx的反向代理

# ngx_http_proxy_module模块:将客户端的请求以http协议转发至指定服务器进行处理  一对一

反向代理单台web 服务器

在location中,根据用户的url来进行代理转发。

# 例如:
server {
    listen 443 ssl;  #https://x.x.x.x/
    listen 80;
    server_name localhost;
    ssl_certificate /etc/nginx/cert/nginx.pem;
    ssl_certificate_key /etc/nginx/cert/nginx.key;
    ssl_session_cache shared:sslcache:20m;

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

server {
   listen 18080 ssl; #https://x.x.x.x:18080 
   server_name localhost;
   ssl_certificate /etc/nginx/cert/nginx.pem;
   ssl_certificate_key /etc/nginx/cert/nginx.key;
   ssl_session_cache shared:sslcache:20m;

   location / {
    proxy_pass http://10.0.0.19:80;
   }
}

#说明
502:后端服务器没连上
504:后端服务器的访问时间过长

proxy_pass语法格式:

proxy_pass http[s]://rs_host:port

如果rs_host:port后面没有uri,相当于location下root的功能,访问地址为:rs_host:port/xxx
    例如: proxy_pass http://10.0.0.9; 

如果rs_host:port后面有uri,相当于location下alias的功能,方位地址为rs_host:port/uri
    例如: proxy_pass http://10.0.0.9/;

NGINX反向代理实现负载均衡:一对多

ngx_http_upstream_module模块:可以实现多个后端服务器的调度。(将客户端的请求转发到一组特定的后端服务器)

实现方式:

将后端服务器进行分组,一组就是一个集群,每个集群里面包含一个或多个服务器。nginx代理服务器将指定的请求转发到对应的集群里面去。集群里面的服务器可以通过轮询或者其它算法来处理代理服务器发过来的请求。
# 通过在http中配置upstream指令块定义一组服务器,转发请求的时候就将请求转发到这组服务器

#http中配置
upstream webserver {  #upstream模块只能在http中配置
       server 10.0.0.9   weight=1 fail_timeout=5s max_fails=3; #5s内连续三次都不能握手成功就认为挂了
       server 10.0.0.11  weight=1 fail_timeout=5s max_fails=3;
     }

#server中配置
location /text { 
             proxy_pass http://webserver/; #将请求转发给那个组
}

upstream指令块:只能再http语句块中定义,定义后端服务组。一个upstream定义一组,多组就需要多个upstream

server参数:指定后端服务器的物理地址。
# server的参数:
weight=number     #设置权重,默认为1,默认就是轮询模式。实现类似于LVS中的WRR,WLC等。
max_conns=number  #后端服务器最多连多少个请求,默认为0表示没有限制
max_fails=number  #失败指定次数以后,就认为后端服务器挂了,默认为1次
fail_timeout=time #超时时间,默认为10秒。判断握手是否能成功,如果再这个时间内连续(max_fails)次失败,那么就认为服务器挂了。
backup  # 设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
        # 例如:server 10.0.0.9  weight=1 fail_timeout=5s max_fails=3 backup; #所有后端服务器都挂了,就让他上

down    # 标记为down状态,让nginx代理服务器认为指定的服务器挂了。
        # 例如:server 10.0.0.9   weight=1 fail_timeout=5s max_fails=3 down; -- 表示认为标记这个服务器为挂了的状态

resolve  # 当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
说明:lvs不会对后端服务器进行健康性检查 nginx能实现后端健康性检查
nginx进行健康性检查的方式:通过握手的方式来判断后端服务器是否存活,基于懒惰的方式(用户访问的时候才会去看后端服务器的健康性)

一对多反向代理的实现范例:

[root@HAproxy ~]# cat /etc/nginx/nginx.conf | grep  -E -v '^#|^#'

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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;
    keepalive_timeout   65;
    types_hash_max_size 2048;

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

    include /etc/nginx/conf.d/*.conf;  

    #后端服务组设置 默认是轮询调度
    upstream web1 {
      server 10.0.0.29:80 weight=1 fail_timeout=5s max_fails=3;
      server 10.0.0.39:80 weight=1 fail_timeout=5s max_fails=3;  
    }

   #当用户访问80端口就转发
   server {
     listen 80;
     server_name www.web1.com;
     location / {
       proxy_pass http://web1/;
     }

   }

}

NGINX四层负载均衡的实现:

四层:传输层,tcp、udp调度。

通过ngx_stream_proxy_module模块可以实现传输层tcp协议负载均衡的实现。编译的时候指定 --with-stream 选项才能支持ngx_stream_proxy_module模块。

相关配置:

通过stream指令来配置四层调度,stream和http是平级的,然后在stream中通过upstream来指定调度的后端服务器组,然后再使用server监听对应的端口。

# 说明:stream指令块和http指令块平级

       # stream指令块:用来设置支持tcp或udp负载均衡的反向代理
stream {
                   #定义一个集群
    upstream name { 
                    server xxx
    }
           #定义监听某个ip地址和端口,当用户访问这个端口的时候,就转发请求到指定的upstream
    server {
             listen: xxx    
    }

}

例如:利用nginx的四层代理实现mysql、redis的负载均衡。

# 主配置文件:定义stream指令块,和http平级
[root@HAproxy ~]# cat /etc/nginx/nginx.conf | grep -E -v '^#|^$'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

     }

stream {
   upstream redis { #定一个一个redis集群
       server 10.0.0.29:6379 max_fails=3 fail_timeout=30s; #集群中的主机 默认采用轮询的算法
       server 10.0.0.39:6379 max_fails=3 fail_timeout=30s;
    }

    server {                 #只写端口指定协议,默认就是tcp端口
       listen 10.0.0.19:6379; #监听10.0.0.8的tcp6379端口   例如监听udp的端口:listen host:port udp
       proxy_connect_timeout 6s;
       proxy_timeout 15s;
       proxy_pass redis;  #用户访问10.0.0.19:6379就调度到redis集群中
    } 
} 

# 测试 另外一台机器安装reidis客户端工具测试
root@ubuntu1804:/etc/nginx/conf.d# redis-cli -h 10.0.0.19
10.0.0.19:6379> get name
"10.0.0.29"
10.0.0.19:6379> exit
root@ubuntu1804:/etc/nginx/conf.d# redis-cli -h 10.0.0.19
10.0.0.19:6379> get name
"10.0.0.39"
10.0.0.19:6379> exit
root@ubuntu1804:/etc/nginx/conf.d# redis-cli -h 10.0.0.19
10.0.0.19:6379> get name
"10.0.0.29"
10.0.0.19:6379> 

文章来源于互联网:NGINX的配置和基本使用

THE END
分享
二维码