nginx为社区版,还有个nginxplus是在其基础上加了许多商业的功能。
浏览器可以解析对输入网址作重定向,如输入http协议的淘宝会自动定向到https,此为80到443端口的重定向。但curl命令不可以。
#dns解析过程
linux中优先级:本地解析/etc/hosts dns解析/etc/resolv.conf .互联网根服务器 .com服务器 taobao.com服务器
#安装源码nginx实验环境
虚拟机可以上网
systemctl disable --now firewalld关闭防火墙
vim /etc/selinux/config 关闭selinux
可以从官网nginx.org下载稳定版源码安装包
安装步骤:
搭建本地软件仓库
源码编译三部曲:
第一步解压并编译。configure
解压后的文件夹中即为nginx源码
这一步是为了编译源码生成可以直接运行安装的二进制文件makefile
错误1
重新编译, 错误2
重新编译,错误3同理
之后重新编译
第二步make,是为了根据makefile文件编译出来所需要的二进制程序
第三步安装,make install,把编译好的二进制程序复制到指定目录下
注:执行此命令时,需要与configure在同一级的目录执行。
#nginx的功能
开启三台虚拟机,通过第一台的nginx实现对其他两台负载均衡,即把外部访问流量均摊到另外两台服务器。
另外两台虚拟机需要配置好软件仓库安装阿帕奇并开启编写测试页面,并关闭防火墙。
在第一台安装了nginx的虚拟机上编辑配置文件
当服务器的监听端口改变时,要修改westos负载均衡器中ip后端口号,因为nginx会对服务器健康监测,不修改的话nginx会去除该服务器。
#nginx并发优化
静态绑定工作进程数,动态则为auto
此时nginx -s reload重载,ps ax发现开启了两个worker
在linux中,优先级:kernel内核大于system操作系统大于app软件
sysctl -a可以列出所有内核选项,ulimit -a查看操作系统
可以在vim /etc/security/limits.conf中定义最大描述数
此时ps axu查看发现nginx从nobody变为以普通用户nginx身份运行
在装有nginx的服务器安装阿帕奇服务,修改端口为8080开启服务并编写测试界面。正常情况下curl 192.168.190.130不会出现130的测试界面,如果此时将其他两台服务器的httpd服务关闭,模拟其余服务器down掉了,此时才会出现130服务器的页面,意为其余服务器均出现问题。
重新启动其余两台服务器的httpd服务
如果客户端与服务器之间有cdn代理,则需要通过浏览器cookie来负载均衡
nginx算法的扩展
此时nginx -t会报错,需要下载插件
首先nginx -s stop停止
下载插件安装包解压
unzip /root/Desktop/nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
然后重新编译源码
make编译
拷贝文件
此时再回到此目录cd /usr/local/nginx/conf/
vim nginx.conf,打开sticky的注释
此时浏览器测试,输入安装了nginx的130服务器IP地址,为其余两台服务器其中一台测试页面,此时刷新测试页面不变,当清除浏览器缓存cookie时,再次访问,则变为另一台服务器测试页面,实现负载均衡的效果。
#nginx平滑升级
删掉高版本nginx,重新下载编译低版本nginx源码
删掉1.22的文件重新解压缩,并进入1.22版本文件中vim auto/cc/gcc将debug调试关掉。
然后同样重新编译并make
升级步骤
两个版本
升级新程序:kill -USR2 当前pid ,ps ax | grep nginx,此时有两个主进程,但是此时curl -I localhost 仍为原版本nginx。
关闭原worker进程但保留主进程,为了回退:kill -WINCH 原进程pid,ps ax | grep nginx此时新进程已经激活,且保留了旧版本主进程。此时curl -I localhost 为新版本nginx。
版本回退:
还原nginx程序:cp -f nginx.bak nginx,用旧版本覆盖新版本
唤醒原进程:kill -HUP 原进程pid,回收新版本的worker进程:kill -WINCH 新版本pid,此时curl -I localhost 为原版本nginx。关闭新版本主进程:kill -QUIT 新进程pid。
#添加虚拟主机
测试:
即通过ip访问为默认/usr/local/nginx/html/index.html页面,当通过域名访问时则为第二个虚拟主机默认发布页面,且可以添加多个虚拟主机,从而访问不同域名时访问不同的虚拟主机。
添加https
测试
#nginx重定向
80重定向到443
#nginx限流
控制单ip并发连接数
此时先不nginx -s reload重载,进行测试,发现全部成功。
执行nginx -s reload重载后,出现失败,
#nginx配置管理
自动索引:下载方便
此时在浏览器无法访问download下的资源图片等,需要加自动索引
nginx expire缓存配置:缓存可以降低网站带宽,加速用户访问。
日志轮询:
日志备份并新创建日志文件。
goaccess日志可视化:
软件安装步骤:
需要解决依赖性
make 编译,make install安装
nginx禁用不必要的日志记录,以节省磁盘IO的消耗
nginx防盗链
#php源码编译
继续configure
重新编译
类似于这样解决一直到没有错误为止。
系统若不带依赖包,即search不到,需要去外网下载。
然后重新configure
成功后make编译,make install安装
进行初始化
nginx结合php-fpm,将nginx与php整合到一起
此时在浏览器通过ip/index.php即可访问
php添加memcache功能模块
下载源码安装包解压
安装过程:
yum install autoconf -y安装
phpize重新运行
./configure
./configure --enable-memcache
make
make install
配置php加载模块
此时可以通过浏览器ip/example.php访问
vim memcache.php
此时可以通过浏览器ip/memcache.php访问,输入账号密码登录
高效缓存策略:
为nginx添加memc和srcache模块或安装openresty
nginx -s stop停掉nginx
下载压缩包并解压 tar zxf openresty-1.19.9.1.tar.gz
安装:
./configure --with-http_stub_status_module --with-http_ssl_module
make
make install
软件配置:
vim nginx.conf
tomcat结合memcache
下载软件tomcat并解压(在两台后端服务器上)
在nginx的主机上对两台服务器做负载均衡
此时在131上访问浏览器ip/index.jsp为后端tomcat发布目录,ip后加上端口8080为正常页面。
tomcat的默认发布目录为/usr/local/tomcat/webapps/ROOT/,test.jsp为测试页面放进去。此时访问该界面,为两台服务器负载均衡,提交刷新后会到另一个页面。要解决这个问题
nginx -s stop
重新编译
./configure --with-http_stub_status_module --with-http_ssl_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
make
nginx启动
此时在131上访问浏览器ip/test.jsp提交表单时不再负载均衡在两台后端服务器之间切换。此时如果让一个服务器down掉,则提交时访问到另一台服务器,但此时之前那台服务器保留的session将会数据丢失。
如何解决?
此时使用memcache,交叉存储
在两台后端服务器上安装yum install memcached,设为开机启动
配置tomcat:
将jar.zip解压到/usr/local/tomcat/lib/目录下
此时实现交叉存储
#mysql8源码编译安装
下载压缩包解压
安装依赖
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_UNIX_ADDR=/usr/local/mysql/data/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/Desktop/soft/mysql-5.7.36/boost/boost_1_59_0
出现了错误缺少依赖包:yum install -y openssl openssl-devel
make
make install
数据库初始化
拷贝启动脚本
修改配置
新建用户
创建数据目录和初始化
由于是临时密码,所以登录数据库后什么都做不了
运行脚本添加新密码
后面是否移除匿名用户y,之后,全部y
下载图形化数据库软件压缩包并解压到/usr/local/nginx/html下,将软件包重命名为phpadmin,在nginx/conf/nginx.conf中默认发布页面index中添加index.php,nginx -s reload,此时可以通过ip/phpadmin访问
nginx -s reload
此时无法登录,需要编辑php主配置文件
此时重新登录访问
lnmp架构
客户端通过http协议发起请求,该请求最先会到达lnmp架构中的nginx
nginx会根据用户的请求进行判断,该判断是由nginx中的location模块完成的。若nginx判断请求是静态页面,则由nginx直接处理并返回客户端;如果请求是动态页面,nginx会将该请求交给fastcgi协议进行下发
fastcgi会将请求交给php-fpm管理进程,该进程接收到后会调用具体的工作进程wrapper
wrapper线程会调用php进行解析,如果是单纯的解析php代码,那么结果会直接返回给客户端;如果有数据库操作,那么php会连接到数据库,然后发起操作
最后数据原路返回,由mysql–>php–>php-fpm–>fastcgi–>nginx–>http–>client
数据库rpm包安装
临时密码登录数据库不能做任何操作,需要重置密码。
此处需要输入系统临时密码才能设置新密码,其余配置均设为yes
实现两台主机的mysql数据库主从复制
master端:安装rpm数据库包并重置密码
开启二进制日志实例
登录mysql -p
此时可以在另一台主机远程登录,但并不是主从复制。
slave端:
同样安装mysql并重置密码
systemctl restart mysqld重启服务
mysql -p 登录
此时两台主机sql实现主从复制,更新第一个主机数据库数据时,第二个主机数据库也会同步更新。
需要两台主机可以通信,否则第一个可能为connection。当第二个为no时,可以先停止slave,然后mysql>
set
global
sql_slave_skip_counter=1;再start启动slave。
gtid:
主机和从机:
vim /etc/my.cnf
systemctl restart mysqld重启mysql
show slave status\G;
三台机器的主从复制(A->B->C)B是A的从机的同时也是C的主机,B从A拿数据,C从B拿数据。
前提先做好底层数据同步,然后再增量。
在c从机上解压并安装数据库。
vim /etc/my.cnf
systemctl restart mysqld
同样在/var/log/mysqld.log查看数据库临时密码,运行mysql_secure_installation脚本输入临时密码并重置数据库密码。
A主机上:
此时再实现B和C的主从复制:
B:
systemctl restart mysqld
C:
start slave;
此时实现B从A取数据,C从B取数据,但此时仍是单向的,只能在A master上写数据,不能再B上写,当A down掉时,A和B数据同步,直接将B的slave关掉即可,B就变为了master,可以写数据。
#mysql主从复制的优化
mysql的半同步复制。
在C上stop slave,然后连到A上。重新让B和C都从A上取数据,作为A的slave。然后重新start slave。然后在BC从机上安装插件。
查看状态
半同步超时时间默认为10s,例如stop停掉从机io线程,在主机插入数据时,在超过这个时间后master会恢复为默认的异步模式,可能会造成数据丢失,从机未同步数据,所以可以将超时时间设置为无穷大,直到从机恢复正常,如start 开启io线程,此时从机会重新同步数据。