初识nginx

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

一: Nginx简介

1.1 nginx概述

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

1.2 nginx做为web服务器

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

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

1.3 正向代理

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

1.4 反向代理

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

ffff.jpg

1.5 负载均衡

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

1.6 动静分离

为了加快网站的解析速度,能够把动态页面和静态页面由不一样的服务器来解析,加快解析速度。下降原来单个服务器的压力。web

image.png

二: Nginx安装

docker安装nginx参照:

docker 入门到实战(七)docker经常使用安装正则表达式

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

3.1 nginx 经常使用的命令

在容器中redis

帮助命令docker

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指令说明:
一、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,若是匹配成功,就中止继续向下搜索并当即处理该请求。
二、~:用于表示 uri 包含正则表达式,而且区分大小写。
三、~*:用于表示 uri 包含正则表达式,而且不区分大小写。
四、^~:用于不含正则表达式的 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