https://segmentfault.com/a/1190000022398646

一: 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,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

1.4 反向代理

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

1.5 负载均衡

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

1.6 动静分离

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

二: Nginx安装

docker安装nginx参照:

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

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

3.1 nginx 常用的命令

在容器中

帮助命令

nginx -h

查看版本信息

nginx -v

关闭命令

nginx -s stop

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

nginx -s reload

设置开机自动启动

chkconfig nginx on

3.2 nginx.conf 配置文件

etc/nginx/conf.d/default.conf#默认资源配置文件etc/nginx/nginx.conf#默认配置/usr/share/nginx/html#初始页面  资源位置/var/log/nginx#日志文件地址

#全局块usernginx;worker_processesauto;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_connections1024;#支持连接的最大数}#http全局块http{log_formatmain'$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;sendfileon;tcp_nopushon;tcp_nodelayon;keepalive_timeout65;types_hash_max_size2048;include/etc/nginx/mime.types;default_typeapplication/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{listen80default_server;listen[::]:80default_server;server_name_;root/usr/share/nginx/html;# Load configuration files for the default server block.include/etc/nginx/default.d/*.conf;location/ {        }error_page404/404.html;location= /40x.html {        }error_page500502503504/50x.html;location= /50x.html {        }    }

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

4.1 配置实例1

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

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

server{listen80;server_nameip地址;location/ {proxy_passhttp://ip地址:9001;        }    }

4.2 配置实例2

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

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

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

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

修改配置文件 server模块

server{listen80;server_nameIP地址;location~ /edu/{proxy_passhttp://IP地址:9001;        }location~ /vod/{proxy_passhttp://IP地址:9002;        }    }

location指令说明:

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

2、~:用于表示 uri 包含正则表达式,并且区分大小写。 

3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。

4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

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

5.1 修改nginx.conf文件的server块

可以参考 nginxa安装

server{listen80default_server;listen[::]:80default_server;server_name39.108.79.168;root/usr/share/nginx/html;# Load configuration files for the default server block.include/etc/nginx/default.d/*.conf;location/ {proxy_passhttp://pic;        }error_page404/404.html;location= /40x.html {        }error_page500502503504/50x.html;location= /50x.html {        }    }upstreampic{server39.108.79.168:9001weight=5;server39.108.79.168:9002weight=5;    }

5.2 nginx 分配服务器策略

第一种 轮询(默认) 

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

第二种weight 

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

第三种ip_hash 

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

第四种fair(第三方) 

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

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

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

查看启动

查看keepalived状态

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

宿主机 外部测试

断开master容器后

你可能感兴趣的:(https://segmentfault.com/a/1190000022398646)