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进程的过程:

nginx进程模型:

每个进程相互独立,多线程的话,虽然多线程的开销要小于进程,但是它们会公用一个内存,

线程之间是相互会有影响的,需要开发人员自己去维护内存管理。并且会增加一定的风险,导致我们出错。

多进程,相互之间是独立的,安全的。如果说一个worker异常退出了,其他的worker会正常运行。

7.Nginx处理web请求机制解析

Nginx本身是性能非常高,非常好的服务器。可以处理的并发数可以达到几十万或者几百万。

Worker抢占机制:use epoll.Linux epoll机制。

Master fork出多个worker进程(fork是底层机制。)

Accept_mutex:互斥锁,多个worker竞争,抢到了才能去处理cilent.

传统服务器事件处理:类似于BIO:

以上是同步阻塞。

Nginx事件处理:本身是异步非阻塞模型,一般有默认的并发数(1024).可以进行配置,根据你的硬件来配置

events {

#默认使用epoll

use epoll;

#每个worker允许连接的客户端最大连接数

worker_connections 1024;

}

使用epoll可以处理6-8万个请求,当worker获得cilent的请求后,对请求处理到阻塞的部分,worker就不会继续等待阻塞的请求,而是处理一些其他客户端的请求。这样worker就可以同时处理多个cilent请求,从而实现了高并发。

Nginx的性能为什么这么高?

1.worker的抢占机制。

2.异步非阻塞的通信模式,多路复用器。

8.nginx.conf配置结构与语法指令

配置里有指令和指令块。

指令:

#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

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文件,每执行一次进行一次切割。


nginx日志切割-定时任务

安装定时任务:

java 复制代码
yum install crontabs

crontab -e 编辑并且添加一行新的任务:

java 复制代码
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh

重启定时任务:

java 复制代码
service crond restart

crontab -l:查询定时任务内容

常用定时任务命令:

service crond start //启动服务

service crond stop //关闭服务

service crond restart //重启服务

service crond reload //重新载入配置

crontab -e // 编辑任务

crontab -l // 查看任务列表

Systemctl stop crond.service:关闭定时任务

Systemctl status crond.service :查看定时任务的状态

相关推荐
梦游钓鱼37 分钟前
在window终端创建docker容器的问题
运维·docker·容器
孤寂大仙v44 分钟前
【Linux笔记】理解文件系统(上)
linux·运维·笔记
沉默的八哥1 小时前
K8S高可用Web应用部署方案
运维
winyh51 小时前
Vite 打包后Nginx部署配置
运维·nginx
运维小贺2 小时前
Nginx常用的模块
运维·nginx·正则表达式
努力学习的小廉2 小时前
深入了解Linux —— 调试程序
linux·运维·服务器
努力学习的小廉3 小时前
深入了解Linux —— git三板斧
linux·运维·git
AI学IT3 小时前
(安全防御)旁挂组网双机热备负载分担实验
运维·服务器·网络
code monkey.4 小时前
【寻找Linux的奥秘】第一章:基础指令
linux·运维·服务器
qziovv4 小时前
Ubuntu通过局域网共享文件夹实现文件夹的连接
linux·运维·ubuntu