哈哈哈哈哈哈
这篇文章不错!
这篇文章不错!
作者对主题的挖掘深入骨髓,展现了非凡的洞察力和理解力。
情感真挚自然,字里行间传递出强烈的感染力。
作者的情感表达细腻入微,让人在阅读中找到了心灵的慰藉。
内容的丰富性和深度让人仿佛置身于知识的海洋,受益匪浅。
# 图片回复
你的文章让我感受到了正能量,非常棒! https://www.4006400989.com/qyvideo/93624.html
你的文章充满了智慧,让人敬佩。 https://www.yonboz.com/video/12554.html
你的文章让我感受到了正能量,非常棒! https://www.4006400989.com/qyvideo/82001.html
你的文章充满了智慧,让人敬佩。 https://www.yonboz.com/video/83913.html
你的文章让我感受到了正能量,非常棒! https://www.4006400989.com/qyvideo/82001.html
你的文章充满了智慧,让人敬佩。 https://www.yonboz.com/video/83913.html
首页
网站统计
关于本站
在线留言
友链申请
高清壁纸
论坛
开往
虫洞
推荐
Linux命令
资源网
Search
1
Typecho Cuteen主题美化
5,129 阅读
2
京东呆瓜搭建青龙面板+xdd-plus机器人+nvjdc配置
4,597 阅读
3
好久不见之网站底部样式
4,237 阅读
4
傻妞机器人最新版安装教程
4,108 阅读
5
Joe 主题 6.xx 底部增强,显示标签及二维码分享
3,114 阅读
Linux
Shell
Mysql
Typecho
网络
其他
Redis
登录
Search
标签搜索
Linux
Typecho
美化
Nginx
Shell
综合架构
Mysql
Joe
源码
Web
数据备份
命令
Ansible
k8s
定时任务
视频
网易云
白嫖
网络
Rsync
小黑
累计撰写
155
篇文章
累计收到
921
条评论
博主
4月14日
在线
首页
栏目
Linux
Shell
Mysql
Typecho
网络
其他
Redis
页面
网站统计
关于本站
在线留言
友链申请
高清壁纸
推荐
Linux命令
资源网
开往
搜索到
36
篇与
Linux
的结果
2021-08-16
Nginx 的配置文件 nginx.conf
Nginx 的配置文件 nginx.conf#user nobody; #主模块命令, 指定Nginx的worker进程运行用户以及用户组,默认由nobody账号运行 worker_processes 1; #指定Nginx要开启的进程数 error_log logs/error.log; #用来定义全局错设日志文件的路径和日志名称 #error_log logs/error.log notice; #error_log logs/error.log info; #日志输出级别有debug(最详细),info,notice,warn,error(默认),crit(严重的,最少) 可供选择 #pid logs/nginx.pid; #用来指定进程id的存储文件位置 events { #设定nginx的工作模式(默认epoll)及连接数上限 worker_connections 1024; } #以上这块配置代码是对nginx全局属性的配置 #下面部分是nginx对http服务器相关属性的设置 http { include mime.types; #文件扩展名与文件类型映射表 #default_type application/octet-stream; #默认文件类型,当文件类型未定义时候就使用这类设置的 default_type text/html; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #指定nginx日志的格式 access_log logs/access.log main; #设置日志存储路径/文件名 日志的格式 sendfile on; # 开启高效文件传输模式(zero copy 方式),避免内核缓冲区数据和用户缓冲区数据之间的拷贝 #tcp_nopush on; #开启tcp_nopush套接字(sendfile开启时有用) #keepalive_timeout 0; #客户端连接超时时间 keepalive_timeout 65; #gzip on; #设置是否开启gzip模块 #下面是server段虚拟主机的配置 server { listen 80; #虚拟主机的服务端口 #listen 80 default_server; #配置成默认端口 server_name localhost; # 用来指定ip或者域名,多个域名用空格分开 #charset koi8-r; access_log logs/host.access.log main; location / { root html; #虚拟主机的网页根目录 index index.html; #默认访问首页文件 } #include /etc/nginx/*.conf; #可以将server写在外面 #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
2021年08月16日
244 阅读
0 评论
1 点赞
2021-08-16
NGINX日志切割
前言Nginx日志对于统计、系统服务排错很有用。Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志)。access.log 记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log 记录服务器错误的日志;设置access.log在nginx.conf文件里面配置access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; #设置访问日志 access_log off; #关闭访问日志path 指定日志的存放位置。format 指定日志的格式。默认使用预定义的combined。buffer 用来指定日志写入时的缓存大小。默认是64k。gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。另外,还有一个特殊的值off。如果指定了该值,当前作用域下的所有的请求日志都被关闭。示例http { ... ##日志格式使用默认的combined;指定日志的缓存大小为32k;日志写入前启用gzip进行压缩,压缩比使用默认值1;缓存数据有效时间为1分钟。 access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m; ... }access_log指令的作用域分别有http,server,location。log_format自定义格式默认的日志格式log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';tail -f /var/log/nginx/access.log设置error_log错误日志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息。错误日志不支持自定义。error_log path [level];path参数指定日志的写入位置。level参数指定日志的级别。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值(等级从低到高排列)。只有日志的错误级别等于或高于level指定的值才会写入错误日志中。默认值是error。error_log logs/error.log; error_log logs/error_notice.log notice; error_log logs/error_info.log info; ##可以将不同的错误类型分开存储日志切割测试按分钟分割编写脚本vim logaccess.sh #!/bin/bash #设置日志文件保存目录 LOG_PATH=/var/log/nginx/ #备份文件名称 LOG_BAK="$(date -d "last_minute" + %Y%m%d%H%M)" #重命名日志文件 mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${LOG_BAK}.log # mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${LOG_BAK}.log #向nginx主进程发信号重新打开日志 kill -USR1 `cat /run/nginx.pid`chmod +x logaccess.sh设置定时任务crontab -e #每分钟进行日志切割 */1 * * * * sh /root/logaccess.sh > /dev/null 2>&1按日切割:vim log2.sh #!/bin/bash #设置日志文件保存目录 LOG_PATH=/var/log/nginx/ #备份文件名称 LOG_PATH_BAK="$(date -d "yesterday" +%Y%m%d)" #重命名日志文件 mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${LOG_BAK}.log # mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${LOG_BAK}.log #向nginx主进程发信号重新打开日志 kill -USR1 `cat /run/nginx.pid`设置定时任务crontab -e #每天23:59分开始执行 59 23 * * * sh /root/logaccess.sh > /dev/null 2>&1
2021年08月16日
507 阅读
0 评论
1 点赞
2021-08-13
Linux top命令详解 -- 罗小黑
top 命令是Linux下常用的性能分析工具,能够实时显示各个进程的占用状况 {mtitle title="详解"/}第一行:系统时间 21:53:29、运行时间:up 8 day、当前连接数:1 user 、 负载均衡(uptime): load average:0.052,0.32,0.35average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了第二行:Tasks — 任务(进程)总进程:115 total、运行;1 running、休眠:111 sleep 、停止: 0 stopped 、僵尸进程:1 zombie第三行:CPU状态1.7%us【user space】 ——用户空间占用CPU的百分比 0.7%sy【sysctl】 ——内核空间占用CPU的百分比 0.0%ni【】 ——改变优先级的进程占用CPU百分比 97.6%id【idolt】 ——空间CPU百分比 0.0%hi【Hardware IRQ】 ——硬中断占用CPU百分比 0.0%si【Software interrupts】 ——软中断占用CPU百分比第四行:内存状态1014684 total, 94888 free, 481152 used, 438644 buff/cache 【缓存的内存量】第五行:swap交换分区信息1049596 total, 889852 free, 159744 used,93376 buff/cache【缓冲的交换分区量】{message type="info" content="备注:PS:可用内存=free + buffer + cached对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,第四行中空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。"/}第七行:各进程(任务)的状态监控ID — 进程idUSER — 进程所有者PR — 进程优先级NI — nice值。负值表示高优先级,正值表示低优先级VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RESRES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATASHR — 共享内存大小,单位kbS —进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程%CPU — 上次更新到现在的CPU时间占用百分比%MEM — 进程使用的物理内存百分比TIME+ — 进程使用的CPU时间总计,单位1/100秒COMMAND — 进程名称(命令名/命令行)详解VIRT:virtual memory usage 虚拟内存1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量RES:resident memory usage 常驻内存1、进程当前使用的内存大小,但不包括swap out2、包含其他进程的共享3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反4、关于库占用内存的情况,它只统计加载的库文件所占内存大小SHR:shared memory 共享内存1、除了自身进程的共享内存,也包括其他进程的共享内存2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小3、计算某个进程所占的物理内存大小公式:RES – SHR4、swap out后,它将会降下来DATA1、数据占用的内存。如果top没有显示,按f键可以显示出来。2、真正的该程序要求的数据空间,是真正在运行中要使用的。top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下:s – 改变画面更新频率l – 关闭或开启第一部分第一行 top 信息的表示t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示N – 以 PID 的大小的顺序排列表示进程列表P – 以 CPU 占用率大小的顺序排列进程列表M – 以内存占用率大小的顺序排列进程列表h – 显示帮助n – 设置在进程列表所显示进程的数量q – 退出 tops – 改变画面更新周期{mtitle title="top使用方法"/}使用格式:top [-] [d] [p] [q] [c] [C] [S] [s] [n]参数说明:d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。p:通过指定监控进程ID来仅仅监控某个进程的状态。q:该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级行。S:指定累计模式。s:使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。i:使top不显示任何闲置或者僵死进程。c:显示整个命令行而不只是显示命令名。常用命令说明Ctrl+L:擦除并且重写屏幕K:终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。i:忽略闲置和僵死进程。这是一个开关式命令。q:退出程序r:重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。S:切换到累计模式。s:改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。f或者F:从当前显示中添加或者删除项目。o或者O:改变显示项目的顺序l:切换显示平均负载和启动时间信息。m:切换显示内存信息。t:切换显示进程和CPU状态信息。c:切换显示命令名称和完整命令行。M:根据驻留内存大小进行排序。P:根据CPU使用百分比大小进行排序。T:根据时间/累计时间进行排序。W:将当前设置写入~/.toprc文件中。查看多核CPU命令mpstat -P ALL 和 sar -P ALL ps:yum install sysstat说明 sar -P ALL >111.txt 重定向内容到111.txtmpstat -P ALLsar -P ALLLinux查看物理CPU个数、核数、逻辑CPU个数# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep "cpu cores"| uniq cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看逻辑CPU的个数 cat /proc/cpuinfo| grep "processor"| wc -l #查看CPU信息(型号) cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c #查看内 存信息 cat /proc/meminfo
2021年08月13日
502 阅读
0 评论
2 点赞
2021-07-19
编译安装MySQL5.7
1.MySQL源码包获取在MySQL官网下载你需要的二进制包版本。官网下载链接:https://downloads.mysql.com/archives/community/本文是以mysql-5.7.28版本为例,所以也可以直接下载我这个版本。链接:https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-5.7.28.tar.gz2.编译安装MySQL2.1 下载源码包wget https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-5.7.28.tar.gz2.2 安装依赖yum -y install gcc gcc-c++ cmake openssl openssl-devel ncurses-devel autoconf2.3 解压源码包tar xf mysql-boost-5.7.28.tar.gz2.4 创建程序目录mkdir -p /application2.5 预编译和编译安装预编译,生成Makefile文件cd mysql-5.7.28 cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.7.28 \ -DMYSQL_DATADIR=/application/mysql-5.7.28/data \ -DMYSQL_UNIX_ADDR=/application/mysql-5.7.28/tmp/mysql.sock \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=./boost/boost_1_59_0/ \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ -DWITH_ZLIB=bundled \ -DWITH_SSL=system \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_EMBEDDED_SERVER=1 \ -DENABLE_DOWNLOADS=1 \ -DWITH_DEBUG=0 编译安装make && make install2.6 创建软连接(也可以直接复制过去)ln -s /application/mysql-5.7.28/ /application/mysql2.7 创建数据库管理用户useradd -M -s /sbin/nologin mysql2.8 授权数据库目录chown -R mysql.mysql /application/mysql-5.7.28/ chown -R mysql.mysql /application/mysql/2.9 拷贝配置文件和启动脚本cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld2.10 编写配置文件[root@db05 ~]# vim /etc/my.cnf [mysqld] datadir=/application/mysql/data socket=/application/mysql/tmp/mysql.sock [client] socket=/application/mysql/tmp/mysql.sock2.11 创建相关目录,并授权mkdir /application/mysql/{tmp,log} chown -R mysql:mysql /application/mysql2.12 初始化数据库初始化/application/mysql/bin/mysqld --initialize --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data获取密码初始化成功后,在命令行输出的最后一行会显示密码3.启动数据库3.1 使用启动脚本启动mysql启动/etc/init.d/mysqld start关闭/etc/init.d/mysqld stop3.2 使用systemd管理mysql服务新建一个mysql服务的unit文件[root@db02 ~]# vim /usr/lib/systemd/system/mysqld.service [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE = 5000重载系统的unit文件systemctl daemon-reload启动服务systemctl start mysqld3.3 检查mysql服务是否启动查看mysql的进程[root@db02 ~]# ps -ef | grep [m]ysql mysql 42951 1 0 14:48 ? 00:00:00 /application/mysql/bin/mysqld --defaults-file=/etc/my.cnf查看端口[root@db02 ~]# netstat -lntp | grep 3306 tcp6 0 0 :::3306 :::* LISTEN 42951/mysqld 3.4 登录数据库使用绝对路径登录[root@db02 ~]# /application/msyql/bin/msyql配置环境变量,直接使用mysql命令因为系统中/usr/bin/或者/usr/sbin/目录下默认是mysql的命令的,修改下PATH变量,让其可以直接使用mysql命令添加环境变量脚本echo "export PATH=/application/mysql/bin:\$PATH" > /etc/profile.d/mysql.sh #重新加载环境变量 source /etc/profile登录mysql[root@db02 ~]# mysql -uroot -p
2021年07月19日
488 阅读
1 评论
0 点赞
2021-07-15
[Linux]利用Linux上传Github
前言我们在上传Github中会遇到,手上没电脑,或者没有电脑,但是手上却有一台服务器,Linux操作系统,那么我们就可以利用Linux上传Githun教程先登录到Github先等你的用户名和邮箱git config --global user.name "你GitHub的用户名"git config --global user.email "你GitHub的邮箱"本地生成密钥ssh-keygen -t rsa -C "注册Github用的邮箱"生成完成后,输入一下会获得一窜秘钥cd ~/.ssh cat id_rsa.pu复制然后GitHub中加入进去先在GitHub个人中心中选择,在选择SSH and GPG keys然后选择New SSH key,然然后添加刚刚生成的秘钥添加进去然后会让你输入一下登录密码,即可输入以下命令检查是否配置成功ssh -T git@github.com只要显示GitHub名称就可以这样基本就配置完成了配置仓库先cd到一个目录,随意目录,都行然后使用以下命令初始化本地仓库git init然后使用以下命令打包文件!git add .在使用以下命令提交说明git commit -m "提交文件"上传文件先去复制仓库地址关联仓库git remote add origin 你的仓库地址关联成功之后就可以愉快的上传了git push -u origin master如果这个地方报错了这个问题是因为远程库与本地库不一致造成的,那么我们把远程库同步到本地库就可以了git pull --rebase origin master就可以了我这边没有报错所以无法测试但是可以使用好了我们可以去看仓库是否长传成功结束本教程百分百原创如果有纰漏请评论谢谢手机写的所以可能有点糙{callout color="#ef6d4d"}转载来源: {abtn color="#ff0d00" href="https://www.pigax.cn/archives/linux-li-yong-linux-shang-chuan-github" content="花语阁"/}{/callout}
2021年07月15日
527 阅读
1 评论
0 点赞
2021-07-12
误操作yum导致error: rpmdb解决方法
今天碰到一个问题就是yum 安装软件时会出现error:rpmdb错误,原因就是rpm数据库损坏。错误: error: rpmdb: BDB0113 Thread/process 18967/139716328294400 failed: BDB1507 Thread died in Berkeley DB library error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery error: cannot open Packages index using db5 - (-30973) error: cannot open Packages database in /var/lib/rpm CRITICAL:yum.main: Error: rpmdb open failed解决方法(重新构建rpm数据库): cd /var/lib/rpm ls Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername rm -rf __db.* rpm --rebuilddb
2021年07月12日
313 阅读
0 评论
0 点赞
2021-07-01
Shell for循环和select循环语句
for循环格式for 变量名 in 变量取值列表 do 指令 done示例打印5 4 3 2 1 5个数字#!/bin/bash for i in 5 4 3 2 1 do echo $i done 方法二 #!/bin/bash for (( i=5;i>0;i--)) do echo $i done PS:改名命令rename命令jpg格式的图片改成pngrename ".jpg" ".png" "*.jpg"打印九九乘法表#!/bin/bash for num1 in `seq 9` do for num2 in `seq 9` do if [ $num1 -ge $num2 ];then if ((($num1*$num2)>9)) ;then echo -en "${num1}x${num2}=$((num1*num2)) " else echo -en "${num1}x${num2}=$((num1*num2)) " fi fi done echo " " done计算1-100的和#!/bin/bash for ((i=1;i<=100;i++)) do ((sum=sum+$i)) done echo "$sum"select循环语句select 变量名 [ in 菜单取值列表] do 指令 done示例:select 循环打印简单菜单项 1、直接使用列表字符串#!/bin/bash select name in zhansan lisi wanger do echo $name done2、采用数组作为变量打印#!/bin/bash array=(zhansan lisi wanger) select $name in "${array[@]}" do echo "$name" done#!/bin/bash PS3="please select a num from menu:" #PS3是select循环的提示符 select name in zhansan lisi wanger do echo -e "I guess you selected the menu is:\n $REPLY) $name" #REPLY变量是菜单项对应的数字 done示例打印选择菜单 ,选择一键安装不同Web服务1.[install lamp] 2.[install lnmp] 3.[exit]#!/bin/bash RETVAR=0 path=/server/scripts #定义脚本路径 [ ! -d "$path" ] && mkdir $path -p #如果不存在就创建 function Usage() { echo "Usage :$0 argv" return 1 } function InstallService() { if [ $# -ne 1 ]; then Usage fi local RETVAR=0 echo "start installing ${1}." sleep 2 if [ ! -x "$path/${1}.sh" ]; then echo "$path/${1}.sh 没有执行权限" return 1 else $path/${1}.sh return $RETVAR fi } function main() { PS3="please input the num you want:" select num in "Install lamp" "Install lnmp" "exit" do case "$num" in "Install lamp") InstallService lamp RETVAR=$? ;; "Install lnmp") InstallService lnmp RETVAR=$? ;; exit) echo bye. return 3 ;; *) echo "the num you input must be {1|2|3}" echo "Input error" esac done echo $ RETVAR } main
2021年07月01日
294 阅读
0 评论
0 点赞
2021-06-26
Shell while循环和until循环语句
while 循环语句的基本语法while <条件表达式> do 指令... done示例:显示每分钟负载情况#!/bin/bash while true do uptime >> uptime.txt sleep 5 done系统显示时间 22:29:31up 6 days 距上次启动开始系统运行时间1 user 一个连接数load average 分别表示1分钟 5分钟 15 分钟系统的平均负载示例:打印54321#!/bin/bash i=5 while (( i > 0 )) do echo "$i" (( i-- )) done #或者用以下 #while [ $i -gt 0 ] #do # echo "$i" # (( i-- )) #doneuntil 循环是不成立进行循环#!/bin/bash i=5 until (( i < 1 )) do echo "$i" (( i-- )) done #until [ $i -lt 1 ] #do # echo "$i" # (( i-- )) #done示例:计算100以内的和#/bin/bash i=1 sum=0 while (( i <=100 )) do (( sum+=i )) (( i++ )) done [ "$sum" -ne 0 ] && printf "$sum\n" #while [ $i -le 100 ] #do # (( sum+=i )) # (( i++ )) #done #[ "$sum" -ne 0 ] && printf "$sum\n"示例:检测网站状态#!/bin/bash read -p "请输入一个网址:" web #判断是否输入网址 [ -z "$web" ] && echo "输入错误" && exit #if [ $# -ne 1 ]; then # echo "请输入一个网址" # exit 1 #fi while true do if [ `curl -o /dev/null --connect-timeout 5 -s -w "%{http_code}" $web|egrep -w "200|301|302"|wc -l` -ne 1 ] 对传入的url进行状态过滤 如果不等于1则表示状态不对 then echo "$web is error" else echo "$web is ok" fi sleep 3 done
2021年06月26日
355 阅读
3 评论
0 点赞
2021-06-21
Shell case条件语句的应用实践
语法格式case "变量" in 值1) 指令1 ;; 值2) 指令2 ;; *) 指令3 ;; esac示例#!/bin/bash read -p "请输入[1-3]数字:" a case "$a" in 1) echo "1" ;; 2) echo "2" ;; 3) echo "3" ;; *) echo "请输入[1-3]" esac示例2#!/bin/bash [ $# -ne 1 ] && echo "Uasge: $0 {start|stop|restart|relad|status}" && exit function start(){ ps aux | grep [n]ginx | grep -q master if [ $? -eq 0 ]; then echo "nginx启动成功" else /usr/local/nginx/sbin/nginx &>/dev/null if [ $? -eq 0 ]; then echo "nginx启动成功" else echo "nginx启动失败" fi fi } function stop(){ ps aux | grep [n]ginx | grep -q master if [ $? -eq 0 ]; then /usr/local/nginx/sbin/nginx -s stop >/dev/null sleep 2 ps aux | grep [n]ginx | grep -q master if [ $? -ne 0 ]; then echo "niginx关闭成功" else echo "nginx关闭失败" fi echo "nginx关闭成功" fi } case "$1" in start) start ;; stop) stop ;; restart) # ps aux | grep [n]ginx | grep -q master # if [ $? -eq 0 ];then # /usr/local/nginx/sbin/nginx -s stop &>/dev/null # sleep 2 # /usr/local/nginx/sbin/mginx &>/dev/null # if [ $? -eq 0 ]; then # echo "nginx 重启成功" # else # echo "nginx重启失败" # fi # else # /usr/local/nginx/sbin/nginx &>/dev/null # if [ $? -eq 0 ];then # echo "nginx重启成功" # else # echo "nginx重启失败" # fi # fi stop start ;; reload) stop start ;; status) ps aux | grep [n]ginx | grep -q master if [ $? -eq 0 ]; then echo "nginx is up" else echo "nginx is down" fi ;; *) echo "Uasge: $0 {start|stop|restart|relad|status}" exit esac
2021年06月21日
227 阅读
0 评论
0 点赞
2021-06-15
Nginx-基础总结(下)
根据域名自定义跳转if ( $host = 'www.baidu.com' ) { rewrite ^/(.*)$ http://baidu.com/$1 permanent; }浏览器的类型,作出相应的跳转# 根据浏览器头部 URL 重写到指定目录 if ($http_user_agent ~* MSIE) { rewrite ^(.*)$ /msie/$1 break; } # 判断是否是手机端 if ( $http_user_agent ~* "(Android|iPhone|Windows Phone|UC|Kindle)" ) { rewrite ^/(.*)$ http://m.qp.com$uri redirect; }禁止访问目录|文件location ~* \.(txt|doc)${ root /data/www/wwwroot/linuxtone/test; deny all; }如果前端是反向代理的情况下:location /admin/ { allow 192.168.1.0/24; deny all; } # 后端 # set $allow false; # if ($allow = false) { return 403;} if ($http_x_forwarded_for !~* ^192\.168\.1\.*) { return 403; }添加模块–支持 WebsockNginx 动态添加模块版本平滑升级,和添加模块操作类似准备模块这里以 nginx-push-stream-module 为例,模块我放在 /data/module 下,你也可以放在其他位置mkdir -p /data/module && cd /data/module/ git clone http://github.com/wandenberg/nginx-push-stream-module.git查看 Nginx 已安装模块/usr/local/nginx/sbin/nginx -V --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --with-pcre 备份源执行文件 备份原来的 nginx 可执行文件 cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak 有必要的话,可以再备份下配置文件,以防万一下载源码编译下载相同版本的 Nginx 源码包编译(以前安装时的源码包),如果已经删除了可重新下载,版本相同即可wget http://nginx.org/download/nginx-1.16.1.tar.gz tar xf nginx-1.16.1.tar.gz cd nginx-1.16.1 ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --with-pcre --add-module=/data/module/nginx-push-stream-module编译Nginx(千万不要make install,不然就真的覆盖了)make mv objs/nginx /usr/local/nginx/sbin/ 查看是否安装 /usr/local/nginx/sbin/nginx -V --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --with-pcre --add-module=/data/module/nginx-push-stream-module 添加模块–支持健康检查模块缺陷?自带健康检查的缺陷:Nginx 只有当有访问时后,才发起对后端节点探测。如果本次请求中,节点正好出现故障,Nginx 依然将请求转交给故障的节点,然后再转交给健康的节点处理。所以不会影响到这次请求的正常进行。但是会影响效率,因为多了一次转发自带模块无法做到预警被动健康检查使用第三访模块 nginx_upstream_check_module:区别于 nginx 自带的非主动式的心跳检测,淘宝开发的 tengine 自带了一个提供主动式后端服务器心跳检测模块若健康检查包类型为 http,在开启健康检查功能后,nginx 会根据设置的间隔向指定的后端服务器端口发送健康检查包,并根据期望的 HTTP 回复状态码来判断服务是否健康。后端真实节点不可用,则请求不会转发到故障节点故障节点恢复后,请求正常转发准备模块yum install patch git -y cd /usr/local/src git clone https://github.com/yaoweibin/nginx_upstream_check_module.git打补丁需进入源码包打补丁个人习惯,源码放在 /usr/local/src例如我的 nginx 源码包存放: /usr/local/src/nginx-1.16.1 , 若源码已经删除,那么去官网上再下载同版本cd /usr/local/src/nginx-1.16.1 patch -p1 < ../nginx_upstream_check_module/check_1.16.1+.patch重新编译nginx -V # configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx_upstream_check_module/ # 在运行中的 nginx 添加模块; 首先一点: 修改东西之前要先备份 mv /usr/loca/nginx/sbin/nginx{,_bak} ./configure --prefix=/usr/local/nginx \ --user=www --group=www \ --with-http_ssl_module \ --with-http_stub_status_module \ --add-module=../nginx_upstream_check_module make # **别手贱, 千万不要 make install** cp objs/nginx /usr/local/nginx/sbin/ 查看模块 nginx -V configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --add-module=../nginx_upstream_check_module如何使用?http { upstream cluster { server 192.168.0.1:80; server 192.168.0.2:80; server 127.0.0.1:80; check interval=5000 rise=1 fall=3 timeout=4000; #check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello; #check interval=3000 rise=2 fall=5 timeout=1000 type=http; #check_http_send "HEAD / HTTP/1.0\r\n\r\n"; #check_http_expect_alive http_2xx http_3xx; } server { listen 80; location / { proxy_pass http://cluster; } location /status { # 默认html,请求方式: check_status html|json|xml; # allow 允许的IP地址 check_status; access_log off; allow SOME.IP.ADD.RESS; deny all; } } }kill -USER2 cat /usr/local/nginx/logs/nginx.pid #热升级nginx,如果当前nginx不是用绝对路径下的nginx命令启动的话,热升级无效。只能 nginx -s stop && /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf`验证curl http://127.0.0.1/status?format=http curl http://127.0.0.1/status?format=xml curl http://127.0.0.1/status?format=json """ {"servers": { "total": 3, "generation": 2, "server": [ {"index": 0, "upstream": "cluster", "name": "192.168.0.1:80", "status": "down", "rise": 0, "fall": 432, "type": "tcp", "port": 0}, {"index": 1, "upstream": "cluster", "name": "192.168.0.2:80", "status": "down", "rise": 0, "fall": 432, "type": "tcp", "port": 0}, {"index": 2, "upstream": "cluster", "name": "127.0.0.1:80", "status": "up", "rise": 4, "fall": 0, "type": "tcp", "port": 0} ] }} """注意事项如果后端是基于域名访问,可使用 check_http_send “GET /xxx HTTP/1.0rn HOST www.xxx.comrnrn”;方式在请求时添加请求头信息参数详解interval: 检测间隔 3 秒 fall: 连续检测失败次数 5 次时,认定 relaserver is down rise: 连续检测成功 2 次时,认定 relaserver is up timeout: 超时 1 秒 default_down: 初始状态为 down,只有检测通过后才为 up type: 检测类型方式 tcp tcp :tcp 套接字,不建议使用,后端业务未 100%启动完成,前端已经放开访问的情况 ssl_hello: 发送 hello 报文并接收 relaserver 返回的 hello 报文 http: 自定义发送一个请求,判断上游 relaserver 接收并处理 mysql: 连接到 mysql 服务器,判断上游 relaserver 是否还存在 ajp: 发送 AJP Cping 数据包,接收并解析 AJP Cpong 响应以诊断上游 relaserver 是否还存活(AJP tomcat 内置的一种协议) fastcgi: php 程序是否存活GIthub 地址https://github.com/yaoweibin/nginx_upstream_check_module添加模块–支持国家城市模块安装依赖 libmaxmindd因为需要读取在 GeoIP2 的 IP 数据库库,需要使用到 libmaxminddb 中的一个 C 库pay源码wget https://github.com/maxmind/libmaxminddb/releases/download/1.3.2/libmaxminddb-1.3.2.tar.gz tar zxvf libmaxminddb-1.3.2.tar.gz cd libmaxminddb-1.3.2 ./configure make make install添加库路径并更新库sh -c "echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf" ldconfig yum yum install libmaxminddb-devel -y下载 GeoIP 源码wget https://github.com/leev/ngx_http_geoip2_module/archive/3.2.tar.gz tar zxvf 3.2.tar.gzNginx 重新编译 ./configure --prefix=/usr/local/nginx --add-module=../ngx_http_geoip2_module-3.2 make && make install下载 GeoLite这个库是为了将 IP 地址翻译成具体的地址信息,下载需要注册…URL: https://www.maxmind.com/en/accounts/current/people/current 账号: xxxx@qq.com 密码: xxx..gunzip GeoLite2-City.mmdb.gz gunzip GeoLite2-Country.mmdb.gz mkdir /data/geoip mv GeoLite2-City.mmdb /data/geoip/city.mmdb mv GeoLite2-Country.mmdb /data/geoip/country.mmdb启用 GeoIPvim /usr/local/nginx/conf/nginx.conf http { geoip2 /data/geoip/country.mmdb { $geoip2_data_country_code default=CN country iso_code; $geoip2_data_country_name country names en; } geoip2 /data/geoip/city.mmdb { $geoip2_data_city_name default=Shenzhen city names en; } server { listen 80; server_name localhost; location / { add_header geoip2_data_country_code $geoip2_data_country_code; add_header geoip2_data_city_name $geoip2_data_city_name; if ($geoip2_data_country_code = CN){ root /data/webroot/cn; } if ($geoip2_data_country_code = US){ root /data/webroot/us; } } }检查 GeoIPmkdir /data/webroot/us mkdir /data/webroot/cn echo "US Site" > /data/webroot/us/index.html echo "CN Site" > /data/webroot/cn/index.html curl 试一试内置变量http://wiki.nginx.org/HttpCoreModule#Variables 官方文档 $arg_PARAMETER $args $binary_remote_addr $body_bytes_sent $content_length $content_type $cookie_COOKIE $document_root $document_uri $host $hostname $http_HEADER $sent_http_HEADER $is_args $limit_rate $nginx_version $query_string $remote_addr $remote_port $remote_user $request_filename $request_body
2021年06月15日
275 阅读
0 评论
0 点赞
2021-06-15
Nginx-基础总结(上)
常规配置模板#user www www; worker_processes auto; error_log /home/wwwlogs/nginx_error.log crit; #pid /usr/local/nginx/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 655350; events { use epoll; worker_connections 655350; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 60; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; proxy_buffer_size 64k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml text/xml application/json; gzip_vary on; log_format access '$remote_addr - $remote_user [$time_local] $host ' '"$request" $status $body_bytes_sent $request_time ' '"$http_referer" "$http_user_agent" "$http_x_forwarded_for"' '$upstream_addr $upstream_status $upstream_response_time' ; #设置Web缓存区名称为cache_one,内存缓存空间大小为256MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。 proxy_temp_path /home/proxy_temp_dir; proxy_cache_path /home/proxy_cache_path levels=1:2 keys_zone=cache_one:256m inactive=1d max_size=30g; server { listen 80; server_name _; return 403; } include vhost/*.conf; }以“exmaple.org”为例,如下为基于 upstream 负载均衡模式的配置:upstream example_backend { server 127.0.0.1:9080; server 192.168.1.198:9080; server 172.16.0.4:80 weight=5 max_fails=3 fail_timeout=10s; # 权重、健康监测 server 172.16.0.5:8080 backup; # 备份节点, ip_hash; #调度算法 } server { listen 80; server_name www.example.org example.com .example.org; location / { # 如果后端服务器出现502 或504错误代码的话nginx就不会请求某台服务器了,当后端服务器又工作正常了,nginx继续请求,这样一来达到了后端服务器健康状况检测的功能, proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; proxy_pass http://example_backend; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置后端连接超时时间 proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; proxy_buffer_size 8k; proxy_temp_file_write_size 64k; # nginx本地cache开启 proxy_cache cache_one; proxy_cache_valid 200 304 30d; proxy_cache_valid 301 302 404 1m; proxy_cache_valid any 1m; proxy_cache_key $host$request_uri; # 客户端缓存,在header中增加“Expires” expires 30d; add_header Cache-Control public; add_header X-Proxy-Cache $upstream_cache_status; proxy_set_header If-Modified-Since $http_if_modified_since; if_modified_since before; } location ~ .*\.(gif|jpg|jpeg|png|bmp|ico|swf|xml|css|js)$ { proxy_pass http://example_backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; expires 15d; } location ~ .*\.(jhtml)$ { proxy_pass http://example_backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; expires -1; } access_log logs/www.example.org.log; }其他的 proxy 配置:1.proxy_set_header :在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。2.proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。3.proxy_read_timeout : 配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。4.proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。5.proxy_redirect :用于修改后端服务器返回的响应头中的Location和Refresh。用户认证# htpasswd -bc /usr/local/nginx/auth/passwd admin 123456 vim /usr/local/nginx/conf/vhost/www.conf server { listen 80; server_name www.com; index index.html index.htm; root /www; location / { auth_basic "test"; auth_basic_user_file /usr/local/nginx/auth/passwd; } #service nginx restart解决跨域# 提示: add_header 也可以添加到 server 中,这样当前 server 下都允许跨域 server { listen 3002; server_name localhost; location /ok { proxy_pass http://localhost:3000; # 指定允许跨域的方法,*代表所有 add_header Access-Control-Allow-Methods *; # 预检命令的缓存,如果不缓存每次会发送两次请求 add_header Access-Control-Max-Age 3600; # 带cookie请求需要加上这个字段,并设置为true add_header Access-Control-Allow-Credentials true; # 表示允许这个域跨域调用(客户端发送请求的域名和端口) # $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号 add_header Access-Control-Allow-Origin $http_origin; # 表示请求头的字段 动态获取 add_header Access-Control-Allow-Headers $http_access_control_request_headers; # OPTIONS预检命令,预检命令通过时才发送请求 # 检查请求的类型是不是预检命令 if ($request_method = OPTIONS){ return 200; } } }URL 重写比如说访问某站点的路径为/forum/ , 此时想使用/bbs 来访问此站点需要做 url 重写如下location / { rewrite ^/forum/?$ /bbs/ permanent; } 比如说某站点有个图片服务器(10.0.0.1/p_w_picpaths/ ) 此时访问某站点上/p_w_picpaths/的资源时希望访问到图片服务器上的资源 location / { rewrite ^/p_w_picpaths/(.*\.jpg)$ /p_w_picpaths2/$1 break; }域名跳转server { listen 80; server_name www.com; rewrite ^/ http://www.www.com/; # return 301 http://www.andy.com/; }域名镜像server { listen 80; server_name www.com; rewrite ^/(.*)$ http://www.www.com/$1 last; }判断表达式-f 和 !-f 用来判断是否存在文件-d 和 !-d 用来判断是否存在目录-e 和 !-e 用来判断是否存在文件或目录-x 和 !-x 用来判断文件是否可执行防盗链location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.com; if ($invalid_referer) { rewrite ^/ http://www.com/403.html; }会话保持# ip_hash使用源地址哈希算法,将同一客户端的请求只发往同一个后端服务器(除非该服务器不可用)。 # 问题: 当后端服务器宕机后,session会话丢失;同一客户端会被转发到同一个后端服务器,可能导致负载失衡; upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com down; } sticky_cookie_insert # 使用sticky_cookie_insert 启用会话亲缘关系,会导致来自同一客户端的请求被传递到一组服务器的同一台服务器。与ip_hash不同之处在于,它不是基于IP来判断客户端的,而是基于cookie来判断。因此可以避免上述ip_hash中来自同一客户端导致负载失衡的情况(需要引入第三方模块才能实现)。 upstream backend { server backend1.example.com; server backend2.example.com; sticky_cookie_insert srv_id expires=1h domain=3evip.cn path=/; } server { listen 80; server_name 3evip.cn; location / { proxy_pass http://backend; } }expires:设置浏览器中保持 cookie 的时间domain:定义 cookie 的域path:为 cookie 定义路径日志切割示列一#!/bin/bash # 适合单个网站日志文件 LOGS_PATH=/home/wwwroot/yunwei/logs yesterday=`date +"%F" -d "-1 days"` mv ${LOGS_PATH}/yunwei.log ${LOGS_PATH}/yunwei-${yesterday}.log kill -USR1 $(cat /var/logs/nginx.pid)示列二#nginx日志切割 # Nginx pid NGINX_PID=$(cat /var/logs/nginx.pid) # 多个日志文件 LOGS=(xxx.access.log xxx.access.log) # Nginx日志路径目录 BASH_PATH="/www/wwwlogs" # xxxx年xx月 lOG_PATH=$(date -d yesterday +"%Y%m") # 昨天日期 DAY=$(date -d yesterday +"%d") # 循环移动 for log in ${LOGS[@]} do # 先判断日志目录是否存在 [[ ! -d "${BASH_PATH}/${lOG_PATH}" ]] && mkdir -p ${BASH_PATH}/${lOG_PATH} # 进入日志目录 cd ${BASH_PATH} mv ${log} ${lOG_PATH}/${DAY}-${log} #kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'` kill -USR1 ${NGINX_PID} # 删除30天的备份,最好是移动到其他位置,不建议 rm -fr #find ${BASH_PATH}/${lOG_PATH} -mtime +30 -name "." -exec rm -fr {} \; done示列三#!/bin/bash #set the path to nginx log files log_files_path="/usr/local/nginx/logs/" log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m") #set nginx log files you want to cut log_files_name=(gw20 gw20-json) #set the path to nginx. nginx_sbin="/usr/bin/nginx" #Set how long you want to save save_days=10 ############################################ #Please do not modify the following script # ############################################ mkdir -p $log_files_dir log_files_num=${#log_files_name[@]} #cut nginx log files for((i=0;i<$log_files_num;i++));do mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log done #delete 30 days ago nginx log files find $log_files_path -mtime +$save_days -exec rm -rf {} \; $nginx_sbin -s reload示列四server{ if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') { set $day $1; } access_log /www/wwwlogs/xxx.com-$day.log main; error_log /www/wwwlogs/xxx.com.error.log; }动静分离为加快网站解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。 在动静分离的 tomcat 的时候比较明显,因为 tomcat 解析静态很慢,简单来说,是使用正则表达式匹配过滤,交给不同的服务器。1、准备环境192.168.62.159 代理服务器 192.168.62.157 动态资源 192.168.62.155 静态资源2、配置 nginx 反向代理 upstream[root@nginx-server conf.d]# cat upstream.conf upstream static { server 192.168.62.155:80 weight=1 max_fails=1 fail_timeout=60s; } upstream phpserver { server 192.168.62.157:80 weight=1 max_fails=1 fail_timeout=60s; } server { listen 80; server_name localhost; #动态资源加载 location ~ \.(php|jsp)$ { proxy_pass http://phpserver; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #静态资源加载 location ~ .*\.(html|gif|jpg|png|bmp|swf|css|js)$ { proxy_pass http://static; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }3、192.168.62.155 静态资源#静态资源配置 server { listen 80; server_name localhost; location ~ \.(html|jpg|png|js|css|gif|bmp|jpeg) { root /home/www/nginx; index index.html index.htm; } }4、192.168.62.157 动态资源server { listen 80; server_name localhost; location ~ \.php$ { root /home/nginx/html; #指定网站目录 fastcgi_pass 127.0.0.1:9000; #指定访问地址 fastcgi_index index.php; #指定默认文件 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #站点根目录,取决于root配置项 include fastcgi_params; #包含nginx常量定义 } }location 优先级当有多条 location 规则时,nginx 有一套比较复杂的规则,优先级如下: `精确匹配= `前缀匹配^~(立刻停止后续的正则搜索) `按文件中顺序的正则匹配~或~* `匹配不带任何修饰的前缀匹配。 这个规则大体的思路是 `先精确匹配,没有则查找带有^~的前缀匹配,没有则进行正则匹配,最后才返回前缀匹配的结果(如果有的话)HTTPS 使用自颁发证书实现建立存放https证书的目录mkdir -pv /usr/local/nginx/conf/.sslkey生成网站私钥文件cd /usr/local/nginx/conf/.sslkey openssl genrsa -out https.key 1024生存网站证书文件,需要注意的是在生成的过程中需要输入一些信息根据自己的需要输入,但Common Name 项输入的必须是访问网站的FQDNopenssl req -new -x509 -key https.key -out https.crt为了安全起见,将存放证书的目录权限设置为400chmod -R 400 /usr/local/nginx/conf/.sslkey vim /usr/local/nginx/conf/vhost/www.conf server { listen 443; server_name www.com; index index.html index.htm; root /www; ssl on; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5; ssl_certificate /usr/local/nginx/conf/.sslkey/https.crt; ssl_certificate_key /usr/local/nginx/conf/.sslkey/https.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; } #重新启动nginx服务 service nginx restar 基于 HTTPS 配置核心配置 upstream example_backend { server 127.0.0.1:9080; server 192.168.1.198:9080; } server { listen 80; server_name www.example.org example.org; rewrite ^/(.*)$ https://$host/$1 last; } server { listen 443; server_name www.example.org example.org; ssl on; ssl_certificate /usr/local/nginx/conf/ssl/example.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/example.key; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1 TLSv1.2 TLSv1.1; ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP; ssl_prefer_server_ciphers on; location / { ... } }根据页面不存在则自定义跳转if (!-f $request_filename) { rewrite ^(/.*)$ http://www.com permanent; }根据文件类型设置过期时间location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ { if (-f $request_filename) { expires 1h; break; } }
2021年06月15日
330 阅读
0 评论
0 点赞
2021-06-14
解决Zabbix中文乱码情况
{mtitle title="问题"/}{mtitle title="解决方法"/}1、从网上下载字体或者在Windows中字体上传到Zabbix服务器,首先我们要查一下Zabbix的默认字体路径find / -name "*fonts*"cd /usr/share/zabbix/assets/fonts cd /etc/alternatives/ cd /usr/share/fonts/dejavu/之后我们把字体上传到这个目录/usr/share/fonts/dejavu/我们先把默认的字体先备份一下cp DejaVuSans.ttf{,.bak} mv msyh.ttf DejaVuSans.ttf #msyh.ttf我上传的字体最后刷新Zabbix界面就好了
2021年06月14日
317 阅读
0 评论
1 点赞
2021-06-12
Centos7部署安装zabbix5.0
zabbix简介zabbix是一个基于WEB界面的提供分布式系统监控以及网络监视功能的企业级的开源解决方案。zabbix 由 server、agent、web、proxy 以及 db 组成。其中:server:是监控代理程序报告系统可用性、系统完成整性和统计信息的核心组件。agent:部署在监控目标上,能够主动监控本地资源和应用程序,并将收集到的数据报告给Zabbix Server。web:为了从任何地方和任何平台都轻松的访问Zabbix,Zabbix提供了基于Web的界面。proxy:可以替Zabbix Server收集性能和可用性数据。Proxy代理服务器是Zabbix软件可选择部署的一部分;当然,Proxy代理服务器可以帮助单台Zabbix Server分担负载压力。主要体现分布式特点。db:所有配置信息和Zabbix收集到的数据都被存储在数据库中。zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD,OS X等平台上。zabbix的特点zabbix的主要特点:安装与配置简单,学习成本低支持多语言(包括中文)免费开源自动发现服务器与网络设备分布式监视以及WEB集中管理功能可以无agent监视用户安全认证和柔软的授权方式通过WEB界面设置或查看监视结果email等通知功能Zabbix功能具备常见的商业监控软件所具备的功能(主机的性能监控、网络设备性能监控、数据库性能监控、FTP等通用协议监控、多种告警方式、详细的报表图表绘 制) 支持自动发现网络设备和服务器;支持分布式,能集中展示、管理分布式的监控点;扩展性强,server提供通用接口,可以自己开发完善各类监控。优劣势优点:开源,无软件成本投入;Server对设备性能要求低(实际测试环境:虚拟机CentOS5,2GCPU 1G内存,监控5台设备,CPU使用率基本保持在10%以下,内存剩余400M以上);支持设备多;支持分布式集中管理;开放式接口,扩展性强。缺点:中文资料较少。一次完整的监控流程可以简单描述为:Host-Groups(设备组)->Hosts(设备)->Applications(监控项组)->Items(监控 项)->Triggers(触发器)->Actions(告警动作)->Medias(告警方式)->User Groups(用户组)->Users(用户)Zabbix的安装与部署以下两个自选一个,我用的是官方的 阿里yum源 zabbix官方文档 我们选择LTS版本(长期支持),下图圈出来的仅供参考,这里我用的是Apache不是NGINX,因为我的服务器环境不干净,之前搭建了LNMP,我用NGINX,到后面访问zabbix的时候一直显示404,这让有点懵 :@(装大款) 下面到正题了1、安装zabbix存储库(zabbix服务器)rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm yum clean all 2、安装 Zabbix 服务器和代理yum install zabbix-server-mysql zabbix-agent -y3、安装 Zabbix 前端yum install centos-release-scl -y编辑配置文件 /etc/yum.repos.d/zabbix.repo and enable zabbix-frontend repository.[zabbix-frontend] ... enabled=1 ...安装 Zabbix 前端包。yum install zabbix-web-mysql-scl zabbix-apache-conf-scl -y4、创建初始数据库,前提你已经安装好了MySQL,这里我就不介绍怎么安装MySQL了,网上教程一堆mysql -uroot -p 输入数据库密码 mysql> create database zabbix character set utf8 collate utf8_bin; mysql> create user zabbix@localhost identified by 'zabbix库密码'; mysql> grant all privileges on zabbix.* to zabbix@localhost; mysql> quit; #导入数据 zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix5、编辑配置文件 /etc/zabbix/zabbix_server.confDBPassword=zabbix库密码编辑配置文件 /etc/opt/rh/rh-php72/php-fpm.d/zabbix.confphp_value[date.timezone] = Asia/Shanghai #时区6、启动Zabbix server和agent进程systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm7、web服务器安装配置(zabbix-agent)安装zabbix存储库(zabbix服务器)rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm yum clean all 安装 Zabbix-agentyum install zabbix-agent -y编辑配置/etc/zabbix/zabbix_agentd.confServer=xxxxx ServerActive=xxxxx Hostname=xxxx启动Zabbix-agent进程systemctl restart zabbix-agent {message type="warning" content="记得防火墙开放端口(10050)"/}最后在浏览器访问http://域名(IP)/zabbix 进行安装配置,这里就不演示了,因为我以及安装好了 ::(捂嘴笑) zabbix本博主也没怎么玩过,这个需要后期研究研究。zabbix添加监控主机添加完成之后等几秒钟就可以看到了其他的自己研究吧
2021年06月12日
323 阅读
0 评论
0 点赞
2021-06-10
nginx负载均衡的5种策略
{mtitle title="负载均衡策略"/}轮询默认方式weight权重方式ip_hash依据IP分配方式least_conn最少连接数fail(第三方)响应时间url_hash(第三方)依据URL分配方式1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。参数:fail_timeout与max_fails结合使用.max_fails设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了fail_time服务器会被认为停机的时间长度,默认为10s。backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。down标记服务器永久停机了。注意:在轮询中,如果服务器down掉了,会自动剔除该服务器。缺省配置就是轮询策略。此策略适合服务器配置相当,无状态且短平快的服务使用。upstream backserver { server 172.16.1.7; server 172.16.1.8 backup; server 172.16.1.9 max_fails=3 fail_timeout=20s; } server { listen 80; location / { proxy_pass http://backserver ; } }2、指定权重指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。upstream backserver { server 172.16.1.7 weight=10; server 172.16.1.8 weight=6; server 172.16.1.9; } server { listen 80; location / { proxy_pass http://backserver ; } }3、IP绑定 ip_hash每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。upstream backserver { ip_hash; server 172.16.1.7:88; server 172.16.1.8:80; server 172.16.1.9; } server { listen 80; location / { proxy_pass http://backserver ; } }4、fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。upstream backserver { server 172.16.1.7; server 172.16.1.8; server 172.16.1.9; fair; } server { listen 80; location / { proxy_pass http://backserver ; } }5、url_hash(第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。upstream backserver { hash $request_uri consistent; server 172.16.1.7; server 172.16.1.8; server 172.16.1.9; } server { listen 80; location / { proxy_pass http://backserver ; } }session共享问题 在最简单的一主一备、负载均衡的集群下,比如两台tomcat服务器和一台nginx负载均衡服务器。当用户访问时,nginx分配给tomcat1服务器处理登陆业务,用户登陆成功,在tomcat1记录了其登陆信息,当页面刷新时,nginx将用户请求分配给tomcat2服务器,在tomcat2服务器上没有用户登陆session,这样就需要用户再次登陆,如果足够巧合,刚好再次登陆的请求转到tomcat1服务器,显示用户登陆,再次刷新刚好又分配给tomcat2服务器,又没有登陆,甚至形成既登陆又没有登陆的矛盾局面。这就造成了不好的体验。 一般的解决办法是,tomcat服务器之间开启session共享广播,当tomcat1服务器记录了session数据后,就广播给其他tomcat服务器。但是,tomcat的session共享的节点数是有上限的。当集群中配置的tomcat节点机到达一定数量后(一般是5个),节点内部通信的流量可能被session广播占满,导致无法顺畅的处理其他业务,特别是难以适应高并发的场景。 避免session广播形成节点上限的解决办法是,配置单点登录的session服务器,适应redis缓存模拟session保存登陆信息。 解决nginx负载均衡的session共享问题
2021年06月10日
461 阅读
0 评论
0 点赞
2021-06-07
误操作yum导致error: rpmdb解决方法
今天碰到一个问题就是yum 安装软件时会出现error:rpmdb错误,原因就是rpm数据库损坏。错误: error: rpmdb: BDB0113 Thread/process 18967/139716328294400 failed: BDB1507 Thread died in Berkeley DB library error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery error: cannot open Packages index using db5 - (-30973) error: cannot open Packages database in /var/lib/rpm CRITICAL:yum.main: Error: rpmdb open failed解决方法(重新构建rpm数据库):cd /var/lib/rpm ls Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername rm -rf __db.* rpm --rebuilddb
2021年06月07日
514 阅读
1 评论
0 点赞
1
2
3