本篇参考于尚硅谷
https://www.bilibili.com/vide...
本次安装全程使用docker

一: Nginx简介

1.1 nginx概述

Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

1.2 nginx作为web服务器

Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。

参考 https://lnmp.org/nginx.html

1.3 正向代理

如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
zzz.png

1.4 反向代理

其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

ffff.jpg

1.5 负载均衡

当客户端请求数据发送到服务器,服务器处理完请求后将结果返回给客户端。这种单一模式在早期是适用的,当访问和数据量增加以及业务复杂度增加时候就不再适用了,可以通过提升服务器配置来解决,但是服务器提升是有限制,顶级物理配置不能解决问题,这样就只能在纵向解决问题。增加服务器数量,把请求分发到各个服务器将负载发到不同的服务器,这就是负载均衡。
FZ.jpg

1.6 动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

image.png

二: Nginx安装

docker安装nginx参照:

docker 入门到实战(七)docker常用安装

三: Nginx常用命令和配置文件

3.1 nginx 常用的命令

在容器中

帮助命令

nginx -h 

image.png

查看版本信息

nginx -v 

关闭命令

nginx -s  stop

重新加载命令 (可做开启命令)

nginx -s  reload

设置开机自动启动

chkconfig nginx on

3.2 nginx.conf 配置文件

image.png

etc/nginx/conf.d/default.conf   #默认资源配置文件
etc/nginx/nginx.conf        #默认配置
/usr/share/nginx/html   #初始页面  资源位置
/var/log/nginx    #日志文件地址
#全局块
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

# events块  影响nginx服务器与用户的网络连接
events {
    worker_connections  1024; #支持连接的最大数
}


#http全局块
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;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    # server 块
    #每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
    #而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
    
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

四: Nginx配置实例-反向代理

4.1 配置实例1

创建一个tomcat容器开放 9001端口

在 nginx.conf文件 中添加serer块 就可以访问tomcat了

server {
        listen       80;
        server_name  ip地址;

    location / {
        proxy_pass http://ip地址:9001; 
        }
    }

image.png

4.2 配置实例2

使用nginx 反向代理,根据访问的路径跳转到不同端口的服务中

访问 ip地址:8080/edu 跳转到ip地址:9001:edu
访问 ip地址:8080/vod 跳转到ip地址:9002:vod

在两个tomcat容器中的webapps文件夹中分别添加edu文件夹和vod文件夹
image.png

修改配置文件 server模块

server {
        listen       80;
        server_name  IP地址;

        location ~ /edu/ {
        proxy_pass http://IP地址:9001; 
        }

        location ~ /vod/ {
        proxy_pass http://IP地址:9002; 
        }
    }

image.png

location指令说明:
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

五: nginx 配置实例-负载均衡

5.1 修改nginx.conf文件的server块

可以参考 nginxa安装
server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  39.108.79.168;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        proxy_pass http://pic; 
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

    upstream pic{
                server 39.108.79.168:9001 weight=5;
                server 39.108.79.168:9002 weight=5;
    }

5.2 nginx 分配服务器策略

第一种 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down 掉,能自动剔除。

第二种weight
weight 代表权重默认为1,权重越高被分配的客户端越多

第三种ip_hash
每个请求按访问ip 的hash 结果分配,这样每个访客固定访问一个后端服务器

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

六: nginx 原理与优化参数配置

image.png
image.png

master-workers的机制的好处

首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

需要设置多少个worker

Nginx 同redis 类似都采用了 io 多路复用机制,每个worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。

设置worker 数量

worker_processes 4
work 绑定cpu(4 work 绑定4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
work 绑定cpu (4 work 绑定8cpu 中的4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000

连接数worker_connection

这个值是表示每个worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP 请 求 本 地 资 源来 说 , 能 够 支 持 的 最大 并 发 数 量 是 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果是HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

七: nginx 搭建集群 主从模式

此处可参考
https://m.jb51.net/article/17...
https://www.cnblogs.com/jinji...

配置好的镜像已经发到阿里云

docker pull registry.cn-shanghai.aliyuncs.com/rem/nginx_keeplived:latest

创建两个容器

docker run -tid --privileged --name nginx_master --restart=always -p 6001:80  rem/nginx_keeplived /usr/sbin/init
docker run -tid --privileged --name nginx_slave --restart=always -p 6002:80  rem/nginx_keeplived /usr/sbin/init

要是容器里面nginx没有启动 可以命令启动 也可以重载启动

systemctl start nginx.service
nginx  -s reload

设置开机启动

chkconfig nginx on

查看启动
image.png

查看keepalived状态
image.png

修改里面的资源文件后访问

image.png

image.png

image.png

image.png

宿主机 外部测试
image.png

断开master容器后
image.png


Remember
24 声望3 粉丝

蓝色空间号里的blueBoy