企业运维实战 LAMP架构 第一篇(nginx源代码编译安装、nginx并发优化、nginx平滑升级、nginx负载均衡及限流)

lamp架构

LAMP是一个缩写,它指一组通常一起使用来运行动态网站或者服务器的自由软件
在这里插入图片描述

Linux,操作系统;
Apache,网页服务器;
MySQL,数据库管理系统(或者数据库服务器);
PHP 和有時 Perl 或 Python,脚本语言。

这里我们使用Nginx替代Apache

nginx的安装与配置

首先准备好nginx的源码压缩包nginx-1.20.1.tar.gz

解压

tar zxf nginx-1.20.1.tar.gz

在这里插入图片描述

进入到解压后的nginx源码目录

cd nginx-1.20.1

源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)

源码编译三部曲之一配置

首先可以通过./configure --help查看配置选项

在这里插入图片描述
开始配置 这里我们设置安装的路径为/usr/local/nginx

./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx

提示缺少gcc

yum install gcc -y

在这里插入图片描述缺少pcre

yum install pcre-devel -y

在这里插入图片描述缺少openssl

yum install openssl-devel -y

在这里插入图片描述
再次配置,显示成功

在这里插入图片描述

源码编译三部曲之二 编译

编译

make

显示成功
在这里插入图片描述

然后在nginx解压目录的objs目录中生成Makefile
在这里插入图片描述

源码编译三部曲之三 安装

安装

make install

nginx的启动

cd /usr/local/nginx/sbin

可以看到 nginx文件
在这里插入图片描述做一个软链接到/usr/local/sbin/,存放超级用户才能使用的第三方软件

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

启动nginx

nginx

然后查看端口,可以看到80端口已开启

netstat -antlp

在这里插入图片描述
浏览器查看172.25.21.1

在这里插入图片描述

nginx如何自定义头信息的内容

查看头信息

curl -I 172.25.21.1

在这里插入图片描述
修改解压目录中的src/core/nginx.h

vim  src/core/nginx.h

修改#define NGINX_VER 后面改称nginx

在这里插入图片描述
先关闭nginx

nginx -s stop

重新编译

make

新生成的文件更换安装目录中的文件

\cp 不询问直接覆盖原文件

\cp objs/nginx /usr/local/nginx/sbin/nginx

再次启动nginx,并查看头信息

可以看到头信息已经更改

在这里插入图片描述

如何瘦身nginx,加快编译

修改相关配置,瘦身nginx,编译后的nginx更加小巧,编译更快

首先查看一下没有瘦身前的nginx大小
在这里插入图片描述关闭nginx

nginx -s stop	

修改解压后的目录中的auto/cc/gcc

vim nginx-1.20.1/auto/cc/gcc 		

关闭c语言编译debug

把debug下面这条注释掉
在这里插入图片描述

清空缓存makdfile 在解压后的目录中执行

make clean				

配置

./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx

编译

make

千万别make install,否则就覆盖安装

此时查看解压后的目录的objs目录下的nginx大小

显示928K

在这里插入图片描述将这个nginx复制替换到安装目录下的nginx文件,新的nginx程序覆盖旧的

cp nginx /usr/local/nginx/sbin/nginx

nginx开机自启设置(使用systemctl来控制nginx)

首先确保nginx没启动,如果启动,先使用nginx -s stop关闭nginx

vim /usr/lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

刷新服务列表

systemctl daemon-reload

启动并设置开机自启动nginx

systemctl enable --now nginx

此时已经可以通过systemctl来控制nginx

修改nginx进程的属主

默认属主
在这里插入图片描述增加一个nginx用户

useradd -M  -d /usr/loacl/nginx -s /sbin/nologin nginx

修改nginx安装目录的nginx.conf

vim /usr/local/nginx/conf/nginx.conf   #根据自己安装目录下的conf/nginx.conf

在这里插入图片描述

重启一下reload

nginx -s reload

可以看到属主变更
在这里插入图片描述

nginx并发优化

进入到nginx的安装后的目录

cd /usr/local/nginx/conf

修改配置文件

vim conf/nginx.conf

修改工作进程数 为2
在这里插入图片描述
检测语法

nginx -t 

在这里插入图片描述
nginx重启

nginx -s reload

查看nginx的worker进程

ps ax |grep nginx

在这里插入图片描述

Nginx默认没有开启利用多核cpu,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核cpu的性能。cpu是任务处理,计算最关键的资源,cpu核越多,性能就越好

2核cpu,开启2个进程
worker_cpu_affinity 01 10;

4个cpu,开启4个进程,以此类推
worker_cpu_affinity 0001 0010 0100 1000;

将worker_processes的模式改为auto,这里会根据主机的cpu核心数决定worker的数量,一核心就是一个worker

vim conf/nginx.conf

在这里插入图片描述

worker_connections每一个worker进程能并发处理(发起)的最大连接数(包含所有连接数),不能超过最大文件打开数

这里需要内核支持最大文件打开数>系统支持最大文件打开数>Worker支持最大文件打开数

vim conf/nginx.conf

在这里插入图片描述
如何查看内核支持的最大文件打开数

sysctl -a |grep file

在这里插入图片描述

如何查看系统支持的最大文件打开数

ulimit -a

在这里插入图片描述系统的最大文件打开数可以修改

vim /etc/security/limits.conf

*: 表示所有的用户,也可以指定指定的用户或用户组
soft: 表示应用软件级别限制的最大可打开的文件数的限制
hard: 表示操作系统级别限制的最大可打开的文件数的限制

*   soft   nofile  65536  
*   hard   nofile  65536 

在这里插入图片描述重新登陆一下shell,使用ulimit -a查看 open files 这一行的值是否生效
在这里插入图片描述
验证nginx 进程最大可打开的文件数 是否生效

重新启动nginx

nginx -s stop
nginx

找到nginx 的 worker process的pid的值

ps aux | grep nginx

查看max open files

cat /proc/pid/limits

在这里插入图片描述

nginx平滑升级

首先准备新版本1.21.1的源代码编译包

nginx-1.21.1.tar.gz

进入解压后的目录,修改相关配置,瘦身nginx,编译加快

vim auto/cc/gcc

将debug注释掉
在这里插入图片描述
配置

./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx

编译

make

不用安装(不要make install)

保存备份老版本nginx

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-old

将生成的nginx去覆盖安装目录下的老的nginx

\cp -f objs/nginx /usr/local/nginx/sbin/nginx

获取当前nginx主进程pid

ps ax|grep nginx

在这里插入图片描述

升级新程序

kill -USR2 master的id 我的是3150

查看新程序

ps ax|grep nginx

在这里插入图片描述

关闭原worker进程但保留主进程,目的是有机会可以回退

kill -WINCH 老的master的id 我的是3150

此时老的worker已经不存在

ps ax|grep nginx

在这里插入图片描述

测试:curl -I 172.25.21.1

显示版本已经到1.21.1
在这里插入图片描述
如何版本回退?

使用刚刚提前保存好老版本的nginx-old

进入 /usr/local/nginx/sbin/
在这里插入图片描述四部曲:

还原nginx程序:# cp -f nginx-old nginx
唤醒原进程:# kill -HUP 老版本id
回收新版本的master进程:kill -WINCH 3150
关闭新版本主进程:kill -QUIT 3150

在这里插入图片描述

nginx负载均衡

此时需要三台虚拟机来进行实验

配置两台没安装nginx的主机

此时在安装好的主机:
将安装好的nginx目录使用scp命令通过ssh传输

scp -r /usr/local/nginx/ server2:/usr/local/nginx/
scp -r /usr/local/nginx/ server3:/usr/local/nginx/

告诉 Systemd 怎么启动这个 Unit,使用systemctl来控制nginx

scp /usr/lib/systemd/system/nginx.service server2:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/nginx.service server3:/usr/lib/systemd/system/

然后到另外两台主机分别执行
创建软链接,可以直接使用nginx

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

创建nginx用户

useradd -M  -d /usr/loacl/nginx -s /sbin/nologin nginx

刷新服务列表

systemctl daemon-reload

启动并设置开机自启动nginx

systemctl enable --now nginx

server2主机修改默认发布页为server2,server3主机修改默认发布页为server3

echo server2(3) > /usr/local/nginx/html/index.html

此时回到server1

使用nginx的http upstream 模块实现客户端访问后端的负载均衡

修改配置文件 vim /usr/local/nginx/conf/nginx.conf

在http加入upstream模块,模块命名为808bass

在这里插入图片描述加入server指令

在这里插入图片描述保存退出

nginx -t #查看语法是否正确
nginx -s reload # 刷新服务

在这里插入图片描述
在要访问的主机中,加入地址解析

vim /etc/hosts

在这里插入图片描述测试访问:

for i in {1..10}; do curl www.808bass.org; done

可以看到 访问时 负载均衡
在这里插入图片描述
再次修改配置文件

vim /usr/local/nginx/conf/nginx.conf

修改权重,172.25.21.2的权重为2,有三分之二的几率被访问,172.25.21.3默认为1,有三分之一的几率被访问
在这里插入图片描述保存退出

nginx -t #查看语法是否正确
nginx -s reload # 刷新服务

测试访问:

for i in {1..10}; do curl www.808bass.org; done

可以看到 访问时 server2大概是server3的两倍

在这里插入图片描述
再次修改配置文件

vim /usr/local/nginx/conf/nginx.conf

加入backup,只要在希望成为后备的服务器ip后面多添加一个backup参数,这台服务器就会成为备份服务器。在平时不使用,nginx不会给它转发任何请求。只有当其他节点全部无法连接的时候,nginx才会启用这个节点。一旦有可用的节点恢复服务,该节点则不再使用,又进入后备状态。
在这里插入图片描述此时要把server 放在最底下,不然backup主机会默认第一个server
在这里插入图片描述

保存退出

nginx -t #查看语法是否正确
nginx -s reload # 刷新服务

改默认发布页内容

echo error > /usr/local/nginx/html/index.html

此时手动关闭server2和server3的nginx 模拟出现故障

在两台服务器执行nginx -s stop

测试访问:

for i in {1..10}; do curl www.808bass.org; done

可以看到 server2和server3都已经挂掉了,此时备份主机开始启用
在这里插入图片描述

再次修改配置文件

vim /usr/local/nginx/conf/nginx.conf

ip_hash这种负载均衡模式根据个人理解就是:例如多个用户通过nginx访问到了后端的nginx集群中,这个时候因为有不同用户,所以ip也不同,ip+hash算法计算的hash值都传到了nginx,nginx就记录了这个ip和hash值,那么下次同一个ip过来还是会分配到这个nginx服务器的。

ip_hash不能与backup一起用

在这里插入图片描述保存退出

nginx -t #查看语法是否正确
nginx -s reload # 刷新服务

测试访问:

for i in {1..10}; do curl www.808bass.org; done

可以看到 只访问了server2这个nginx服务器

在这里插入图片描述
使用nginx sticky实现基于cookie的负载均衡

修改配置文件

vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述
关闭nginx服务

nginx -s stop

得装一个插件
nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip插件压缩包
下载unzip压缩工具,并且解压文件

yum install unzip -y
unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

进入到nginx的源码编译目录

配置 带上模块--add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42

./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42

make 编译

显示成功
在这里插入图片描述

不用安装!!!

可以看到nginx从928到936 说明插件安装完成
在这里插入图片描述新的nginx覆盖旧的nginx

cp -f objs/nginx /usr/local/nginx/sbin/nginx

关闭nginx

nginx -s stop

重启

nginx

浏览器测试 (确保server2和server3的nginx启动)

访问172.25.21.1
一直是server2
在这里插入图片描述进入浏览器设置

删除cookie
在这里插入图片描述
重新访问

可以看到一直访问server3
在这里插入图片描述

nginx限流

nginx可以通过limit_conn_zone 和limit_req_zone两个组件来对客户端访问目录和文件的访问频率和次数进行限制

修改配置文件

vim /usr/local/nginx/conf/nginx.conf

limit_conn_zone $binary_remote_addr zone=addr:10m; 限制访问频率
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s	限制访问频次,这里限制每秒1次

limit_conn addr 1	限制并发次数
limit_rate 50k	限制带宽
limit_req zone=one burst=5 nodelay 限制在1s内只能一次,且只能排队五个,后面的不等待

在这里插入图片描述

使用ab命令做压力测试

ab -c10 -n10  http://172.25.21.1/download/vim.jpg   #c是并发数 n是次数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pu.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值