LVS+Nginx高可用集群--基础篇

1.集群概述

单体部署:

可以将上面内容分别部署在不同的服务器上。

单体架构的优点:

小团队成型就可完成开发,测试,上线

迭代周期短,速度快

打包方便,运维简单

单体架构的挑战:单节点宕机造成所有服务的不可用(多节点);耦合度太高(迭代,测试,部署)(分布式部署);单节点并发能力有限(负载均衡)

集群:计算机"整体"构成整个系统;这个"群体"构成一个整体,不能独立存在;群体提升并发与可用性

集群的优势:提高系统性能;提高系统可用性;可扩展性高;

使用集群的注意点:

用户会话:会话要使用分布式会话,通过Redis缓存实现分布式会话。

定时任务:所有的计算机节点,上面所有的任务,在某个时刻,都会跑一遍;任务都是一模一样,会浪费计算机的资源。可以统一做定时任务的服务;或者使用mq的延时任务。

内网互通:必须保障。

2.什么是Nginx?常用的web服务器有哪些?

Nginx:高性能的http和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务;主要功能是反向代理;通过配置文件实现负载均衡或者集群;静态资源的虚拟化

常见的服务器:

3.什么是反向代理?

正向代理:客户端请求目标服务器之间的一个代理服务器;

请求会先经过代理服务器,然后再转发请求到目标服务器,获得内容后最后响应给客户端。

反向代理:

用户请求目标服务器,由代理服务器决定访问哪个ip

教务处相当于方向代理。

正向代理和反向代理的区别:

位置不同

正向代理,架设在客户机和目标主机之间;

反向代理,架设在服务器端;

代理对象不同

正向代理,代理客户端,服务端不知道实际发起请求的客户端;

反向代理,代理服务端,客户端不知道实际提供服务的服务端;

用途不同

正向代理,为在防火墙内的局域网客户端提供访问Internet的途径;

反向代理,将防火墙后面的服务器提供给Internet访问;

安全性不同

正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务;

反向代理都对外都是透明的,访问者并不知道自己访问的是哪一个代理。

备注:正向代理--HTTP代理为多个人提供翻墙服务;反向代理--百度外卖为多个商户提供平台给某个用户提供外卖服务。

4.Nginx安装与运行

(1)去官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本

(2)上传nginx到linux系统

(3)安装依赖环境

安装gcc环境;

java 复制代码
 yum install gcc-c++

安装PCRE库,用于解析正则表达式;

java 复制代码
 yum install -y pcre pcre-devel

zlib压缩和解压缩依赖;

java 复制代码
 yum install -y zlib zlib-devel

SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https

java 复制代码
yum install -y openssl openssl-devel

(4)解压,需要注意,解压后得到的是源码,源码需要编译后才能安装

java 复制代码
tar -zxvf nginx-1.16.1.tar.gz

(5)编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错

java 复制代码
mkdir /var/temp/nginx -p

(6)在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件

java 复制代码
./configure \n    --prefix=/usr/local/nginx \n    --pid-path=/var/run/nginx/nginx.pid \n    --lock-path=/var/lock/nginx.lock \n    --error-log-path=/var/log/nginx/error.log \n    --http-log-path=/var/log/nginx/access.log \n    --with-http_gzip_static_module \n    --http-client-body-temp-path=/var/temp/nginx/client \n    --http-proxy-temp-path=/var/temp/nginx/proxy \n    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \n    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \n    --http-scgi-temp-path=/var/temp/nginx/scgi

配置命令:

(7)make编译

java 复制代码
make

(8)安装

java 复制代码
make install

(9)进入sbin目录启动nginx

java 复制代码
./nginx

停止:./nginx -s stop

重新加载:./nginx -s reload

(10)打开浏览器,访问虚拟机所处内网ip即可打开nginx默认页面,显示如下便表示安装成功:

注意事项:

如果在云服务器安装,需要开启默认的nginx端口:80

如果在虚拟机安装,需要关闭防火墙

本地win或mac需要关闭防火墙

5.Nginx显示默认首页过程解析

内网环境:使用内网ip

云服务器:使用外网ip

请求nginx默认页面:

Nginx主要配置:

java 复制代码
 server {
        listen       80;
        server_name  localhost;

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

6.Nginx进程模型解析

ps -ef|grep nginx 查询nginx相关进程。

java 复制代码
root      2856 32390  0 10:12 pts/1    00:00:00 grep --color=auto nginx
root     21121     1  0 08:29 ?        00:00:00 nginx: master process ./nginx
nobody   21122 21121  0 08:29 ?        00:00:00 nginx: worker process

Master进程:主进程。Master接收外界的一些信号,传递给对应的worker进程;监控worker

worker进程:工作进程,为master服务

master接收一些信号,然后传递给相应的worker进程;master还可以对发送的指令可以读取并验证核心配置文件的有效性:

具体实例:

root@VM-0-9-centos conf\]# .../sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful Worker进程数量是可以配置的。 配置worker进程的过程: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ea08cf61ce1f42ce81afe4b71453036f.png) nginx进程模型: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7b71426764b04e2db7279de8a3b4962f.png) 每个进程相互独立,多线程的话,虽然多线程的开销要小于进程,但是它们会公用一个内存, 线程之间是相互会有影响的,需要开发人员自己去维护内存管理。并且会增加一定的风险,导致我们出错。 多进程,相互之间是独立的,安全的。如果说一个worker异常退出了,其他的worker会正常运行。 ### 7.Nginx处理web请求机制解析 Nginx本身是性能非常高,非常好的服务器。可以处理的并发数可以达到几十万或者几百万。 Worker抢占机制:use epoll.Linux epoll机制。 Master fork出多个worker进程(fork是底层机制。) Accept_mutex:互斥锁,多个worker竞争,抢到了才能去处理cilent. ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a64b56f915674b228cc8ae9715a9b831.png) 传统服务器事件处理:类似于BIO: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3fb9fd84eb9c4fa9beda4cfc1067043d.png) 以上是同步阻塞。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cc3e39ee179443dbb9d84728ceb17503.png) Nginx事件处理:本身是异步非阻塞模型,一般有默认的并发数(1024).可以进行配置,根据你的硬件来配置 events { #默认使用epoll use epoll; #每个worker允许连接的客户端最大连接数 worker_connections 1024; } 使用epoll可以处理6-8万个请求,当worker获得cilent的请求后,对请求处理到阻塞的部分,worker就不会继续等待阻塞的请求,而是处理一些其他客户端的请求。这样worker就可以同时处理多个cilent请求,从而实现了高并发。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dac3e5dc504a4b90b87b2e65da1ddf12.png) Nginx的性能为什么这么高? 1.worker的抢占机制。 2.异步非阻塞的通信模式,多路复用器。 ### 8.nginx.conf配置结构与语法指令 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e4ff70b9e31940f099a871179383910c.png) 配置里有指令和指令块。 指令: #user nobody; worker_processes 2; 指令块: events { #默认使用epoll use epoll; #每个worker允许连接的客户端最大连接数 worker_connections 1024; } ### 9.同步与异步,阻塞与非阻塞 同步:关键字:轮询;异步:通知; 阻塞:关键字:一直等待;非阻塞:关键字:不用等 还可以根据客户端和服务器端分开处理。 同步时客户端就会阻塞。阻塞时,服务器端就会阻塞。 从客户端和服务器端的角度来理解,异步:服务器端会通知你后台正在处理,客户端可以处理其他请求。 对于阻塞以及非阻塞的理解,关键点在于,非阻塞时,服务器端可以继续处理请求,极大的节省系统资源。经济效益高 ### 10.Nginx.conf核心配置文件 设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody user root;//涉及到操作系统用户的权限问题,nobody跟root用户操作文件的权限完全不同。 ```java user root; ``` worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行 ```java worker_processes 1; ``` nginx 日志级别debug \| info \| notice \| warn \| error \| crit \| alert \| emerg,错误级别从左到右越来越大 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; 通过不同的日志级别,输出不同的日志内容 此处配置的日志文件在: --error-log-path=/var/log/nginx/error.log 设置nginx进程 pid 配置内容: --pid-path=/var/run/nginx/nginx.pid ```java pid logs/nginx.pid; ``` 设置工作模式 ```java events { # 默认使用epoll use epoll; # 每个worker允许连接的客户端最大连接数 worker_connections 10240; } ``` http 是指令块,针对http网络传输的一些指令配置 ```java http { } ``` include 引入外部配置,提高可读性,避免单个配置文件过大 ```java include mime.types; ``` 设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了 --http-log-path=/var/log/nginx/access.log ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9db579f1453d47609687ca9c45b5d021.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/712a469a2413413d9f883577a5c32fba.png) sendfile使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率。 ```java sendfile on; tcp_nopush on; ``` keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。 ```java #keepalive_timeout 0; keepalive_timeout 65; ``` gzip启用压缩,html/js/css压缩后传输会更快 ```java gzip on; ``` server可以在http指令块中设置多个虚拟主机 listen 监听端口 server_name localhost、ip、域名 location 请求路由映射,匹配拦截 root 请求位置 index 首页设置 ```java server { listen 88; server_name localhost; location / { root html; index index.html index.htm; } } ``` ### 11.nginx常用命令解析 **Nginx常用命令:** ./nginx -t:查看配置文件是否正确 ./nginx -s reload:重启nginx ./nginx 启动 ./nginx -s stop 关闭 ./nginx -s reload 重启 可以将配置的多台server 保存在xxx.conf文件中,然后通过include引入。 暴力关闭nginx:./nginx -s stop 强制关闭。 友好关闭:./nginx -s quit:会维持当前用户连接直到用户不再发送请求关闭连接。针对一些http请求。 检验:./nginx -t :配置文件发生更改,检查配置文件是否有问题 查看相关版本号 ./nginx -v 展示具体的信息:./nginx -V 提供命令的帮助: ./nginx -h或者./nginx -? 指定特定的配置文件 ./nginx -c ### 12.nginx日志切割-手动 去特定目录下查看日志文件: 命令: cd /var/log/nginx 然后根据以前的配置查询所有相关的文件 命令:/usr/local/nginx/sbin/nginx -V 查询的是之前安装nginx所有相关的配置。 首先创建对应的文件:cut_my_log.sh 代码: ```java #!/bin/bash LOG_PATH="/var/log/nginx/" RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M) PID=/var/run/nginx/nginx.pid mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log #向Nginx主进程发送信号,用于重新打开日志文件 kill -USR1 `cat $PID` ``` 新建文件添加权限。 chmod +x cut_my_log.sh 成功后,文件变成绿色。 测试日志切割后的结果: ./cut_my_log.sh 测试: 根据时间戳生成的log文件,每执行一次进行一次切割。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b2e57e2844c74f3bbbbded2b8d18496e.png) **nginx日志切割-定时任务** 安装定时任务: ```java yum install crontabs ``` crontab -e 编辑并且添加一行新的任务: ```java */1 * * * * /usr/local/nginx/sbin/cut_my_log.sh ``` 重启定时任务: ```java service crond restart ``` crontab -l:查询定时任务内容 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ef8bad4511d14161b2f2f544c4d9c9f7.png) 常用定时任务命令: service crond start //启动服务 service crond stop //关闭服务 service crond restart //重启服务 service crond reload //重新载入配置 crontab -e // 编辑任务 crontab -l // 查看任务列表 Systemctl stop crond.service:关闭定时任务 Systemctl status crond.service :查看定时任务的状态

相关推荐
正经教主6 小时前
【问题】解决docker的方式安装n8n,找不到docker.n8n.io/n8nio/n8n:latest镜像的问题
运维·docker·容器·n8n
唯独失去了从容7 小时前
WebRTC服务器Coturn服务器中的通信协议
运维·服务器·webrtc
joker_zsl8 小时前
docker的安装和简单使用(ubuntu环境)
运维·docker·容器
Run1.8 小时前
深入解析 Linux 中动静态库的加载机制:从原理到实践
linux·运维·服务器
VI8664956I268 小时前
全链路自动化AIGC内容工厂:构建企业级智能内容生产系统
运维·自动化·aigc
264玫瑰资源库9 小时前
斗鱼娱乐电玩平台源码搭建实录
运维·服务器·游戏·娱乐
Jogging-Snail10 小时前
从零开始掌握Linux数据流:管道与重定向完全指南
linux·运维·管道·重定向·linux 数据流·管道原理
niuTaylor10 小时前
Linux驱动开发快速上手指南:从理论到实战
linux·运维·开发语言·驱动开发·c#
fxshy11 小时前
ai聊天流式响应,阻塞式和流式响应 nginx遇到的坑
运维·javascript·nginx
mit6.82411 小时前
[OS_8] 终端和 UNIX Shell | 会话和进程组 | sigaction | dash
运维·服务器