目录
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是次数