【Nginx】Nginx 快速入门

本文详细介绍了如何在Docker环境下安装和配置Nginx,包括反向代理、负载均衡和动静分离的实现。通过实例展示了如何通过Nginx进行反向代理以访问Tomcat服务,以及设置不同负载均衡策略。此外,还提到了Nginx与Keepalived结合实现高可用性的方法,确保服务的稳定性和可靠性。
摘要由CSDN通过智能技术生成

一、简介

ginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了IMAP/POP3/SMTP 服务。Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。

其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2022年01月25日,nginx 1.21.6发布。

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

通常我们会使用 Nginx 实现 反向代理、负载均胜、动静结合、高可用。


二、Docker 安转 Nginx

下载并安装:
docker run --name nginx-test -p 80:80 -d nginx

查看进程:
docker ps
在这里插入图片描述


你也可以选择挂载文件。或者通过 docker inspect 容器ID 直接找到 docker 容器中的目录在linux的中的物理位置—— "GraphDriver" 下的 "MergedDir"

挂载:

docker run --name nginx --restart=always -p 80:80 \
	-v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
	-v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
	-v /data/docker/nginx/html:/usr/share/nginx/html \
	-v /data/docker/nginx/logs:/var/log/nginx \
	-d nginx:latest

docker容器对应的物理位置: 使用 docker inspect tomcat-test 找到 "GraphDriver" 下的 "MergedDir" 进入 "MergedDir" 对应的目录


三、反向代理

1、介绍

所谓的 反向代理 就是客户端在访问目标服务器是不是直接访问,而是需要通过一个中间服务器(Nginx)进行转发请求到真实的服务器。在这个过程中,中间服务器(Nginx)与目标服务器对于客户端而言是一个整体,因为在客户端的角度而言只是中间服务器(Nginx)是对其暴露的。
在这里插入图片描述

2、实操

我们的目标是使用客户端访问 www.bidea.com 访问 tomcat

步骤一

1、安装创建 tomcat 容器 docker run -d --name tomcat-test -p 8080:8080 tomcat:jdk8

2、使用 docker inspect tomcat-test 找到 "GraphDriver" 下的 "MergedDir" 进入 "MergedDir" 对应的目录

3、进入webapps cd /usr/local/tomcat/webapps
在这里插入图片描述
4、创建ROOT目录 mkdir ROOT, 创建 index.html

步骤二

1、安装创建 nginx 容器 docker run --name nginx-test -p 80:80 -d nginx

2、使用 docker inspect nginx-test 找到 "GraphDriver" 下的 "MergedDir" 进入 "MergedDir" 对应的目录

3、进入nginx cd /etc/nginx
在这里插入图片描述

4、配置 nginx.conf


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;
    server {
        listen  80;   # nginx 所在的 Linux 的 Port
        server_name     192.168.174.134;  # nginx 所在的 Linux 的 IP
        location / {   # 当访问 192.168.174.134:80 或 192.168.174.134 时,转发到http://192.168.174.134:8080
                proxy_pass      http://192.168.174.134:8080;
                root    html;
                index   index.html index.htm;
        }
    }

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

步骤三

配置 Windows 的 host 文件,配置 www.bidea.com 192.168.174.134
在这里插入图片描述
添加: 192.168.174.134 www.bidea.com

访问: http://www.bidea.com/
在这里插入图片描述


四、负载均胜

1、介绍

负载均衡作用的目标是集群服务,当并发量很大时一台服务器无法支撑需求,此时我们就要使用集群来应付,但是集群带来了一个问题是我们应该如何保证整个集群被充分应用,此时我们就要使用 Nginx 的负载均衡。
在这里插入图片描述

2、负载均衡的策略

策略一:轮询(默认)
每一个请求按照时间顺序逐一分配到不同的后端服务,如果后端服务宕机,nginx 可以自动删除。

策略二:weight
weight 代表权重默认为1,权重越高被分配的客户端越多。

例如:

    upstream myserver {  # 设置参与负载均衡的服务组
        server  192.168.174.134:8080 weight=10;
        server  192.168.174.134:8081 weight=15;
    }

策略三:ip_hash
每一个请求按照访问 IP 的 Hash 结果分配,这样每一个访客固定访问一个后端服务器。这样方式很适合在自己写的项目(Tomcat)上使用,这样可以避免服务器之间 Session 的传递。

例如:

    upstream myserver {  # 设置参与负载均衡的服务组
        ip_hash;  ###
        server  192.168.174.134:8080;
        server  192.168.174.134:8081;
    }

策略四:fair(第三方)
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。

例如:

    upstream myserver {  # 设置参与负载均衡的服务组
        fair;  ###
        server  192.168.174.134:8080;
        server  192.168.174.134:8081;
    }

3、实操

步骤一

配置两个 tomcat (上面有例子)

步骤二

1、安装创建 nginx 容器 docker run --name nginx-test -p 80:80 -d nginx

2、使用 docker inspect nginx-test 找到 "GraphDriver" 下的 "MergedDir" 进入 "MergedDir" 对应的目录

3、进入nginx cd /etc/nginx
在这里插入图片描述

4、配置 nginx.conf

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;
    upstream myserver {  # 设置参与负载均衡的服务组
        server  192.168.174.134:8080;
        server  192.168.174.134:8081;
    }
    server {
        listen  80;   # nginx 所在的 Linux 的 Port
        server_name     192.168.174.134;  # nginx 所在的 Linux 的 IP
        location / {
                proxy_pass      http://myserver;   # myserver为参与负载均衡的服务组的名称(自定义)
                root    html;
                index   index.html index.htm;
        }
    }

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

步骤三

多次访问 http://www.bidea.com/
在这里插入图片描述


五、动静分离

1、介绍

我们可以通过配置 Nginx 的配置,实现客户端访问linux的静态资源。

Nginx 动静分离简单来说就是把动态和静态请求分开,不能理解成只是简单的把动态页面和静态页面物理分开,严格意义上说应该是动态请求根静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。

动静分页从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开(我在这里不演示这种)。
在这里插入图片描述

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;
    server {
        listen  80;
        server_name     192.168.174.134;
        # 访问 192.168.174.134/www 会转发到 192.168.174.134/usr/data/www
        location /www/ {
                root    /usr/data/;
                autoindex auto;
        }
		# 访问 192.168.174.134/images 会转发到 192.168.174.134/usr/data/images
        location /images/ {
                root    /usr/data/;
                autoindex       on;
        }
    }

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

六、高可用(Nginx + Keepalived)

Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。

基本思想就是通过,我们通过 keepalived 来监控 Nginx 主机的存活情况。当 MASTER 主机宕机之后,keepalived 保证备用机(BACKUP)承担起 MASTER 的职责。
在这里插入图片描述
上述过程的实现的关键是要依靠两个配置文件,第一个:分别在三个 linux 中的 /etc/keepalived 目录下,建立 check_nginx.sh 文件。并添加执行权限:chmod +x check_nginx.sh(这里不需要,因为是root权限下,保险起见还是贴出来了)。check_nginx.sh 脚本文件,是用来检查 niginx 是否启动的。第二个:分别修改三个 linux 中的 /etc/keepalived 目录下的 keepalived.conf 文件(注意区分 master 和 backup),Keepalived将会依赖这个文件实现高可用。

check_nginx.sh:

#!/bin/bash
if [ `ps -C nginx --no-header |wc -l` -eq 0 ]  #用于查看当前nginx运行状况
  then
     systemctl start nginx 
     sleep 2
  if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
     then
        kill keepalived
  fi
fi

keepalived.conf(MASTER):

global_defs {
   router_id LVS_DEVEL  #节点名,一般使用默认的就可以
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh" #检测nginx脚本的路径
    interval 2  #运行脚本的间隔时间
    weight -20  #变更的权重
}

vrrp_instance VI_1 {
    state MASTER  #此节点为MASTER,如果此节点down掉,再重启时,会立即抢占回主节点
    # mcast_src_ip 172.17.0.2  本机ip,不声明则默认绑定本机ip
    interface eth0  #绑定的网卡,可以通过ifconfig查看网卡信息
    virtual_router_id 70  #虚拟路由标识,同一组的必须相同
    priority 100  #权重
    nopreempt  #定义为非抢占式,因为多次主备切换对请求量大的服务器不太好
    advert_int 1  #与组内其他节点发送心跳的间隔:s
    virtual_ipaddress { #绑定的虚拟ip组
        172.17.0.200
    }  
    track_script {  #执行前面声明的脚本
        chk_nginx
    } 
}

keepalived.conf(BACKUP):

global_defs {
   router_id LVS_DEVEL  #节点名,一般使用默认的就可以
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh" #检测nginx脚本的路径
    interval 2  #运行脚本的间隔时间
    weight -20  #变更的权重
}

vrrp_instance VI_1 {
    state BACKUP  #此节点为backup
    # mcast_src_ip 172.17.0.3  本机ip,不声明则默认绑定本机ip
    interface eth0  #绑定的网卡,可以通过ifconfig查看网卡信息
    virtual_router_id 70  #虚拟路由标识,同一组的必须相同
    priority 90  #权重,备节点的权重要比主节点小
    advert_int 1  #与组内其他节点发送心跳的间隔:s。组内间隔必须相同
    virtual_ipaddress { #绑定的虚拟ip组
        172.17.0.200
    }  
    track_script { #执行前面声明的脚本
        chk_nginx
    }  
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值