=============================================
一,nginx基本应用
Nginx("engine x")
是俄罗斯人编写的HTTP服务工具
1,环境准备
yum -y install vim //安装vim编辑器
yum list | grep bash //查询名字和bash有关的软件包
yum -y install bash-completion //安装支持tab键的软件包
装好之后,使用exit退出,重新登录才生效
Yum -y install net-tools //安装网络相关软件包
yum -y install psmisc //安装支持killall命令的软件
yum -y install gcc make //安装编译工具
yum -y install pcre-devel //安装可以让nginx支持正则的软件包
yum -y install openssl-devel //安装可以让nginx支持安装加密网站
的软件包
然后将lnmp_soft.tar.gz 传入虚拟机的root家目录
scp /linux-soft/2/lnmp_soft.tar.gz 192.168.2.5:
cd //到家目录
tar -xf lnmp_soft.tar.gz //解压tar包
cd lnmp_soft/
tar -xf nginx-1.17.6.tar.gz //释放nginx
cd nginx-1.17.6/ //进入nginx目录
./configure --prefix=/usr/local/nginx --user=nginx --with-http_ssl_module
//配置,--prefix是指定安装路径,--user是指定用户
--with-http_ssl_module是安全网站模块
make //编译
make install //安装
ls /usr/local/nginx/ //检测看到4个目录则成功
-------------------------------------------------------------
ls /usr/local/nginx/ //安装好之后查看目录
conf 存放配置文件 sbin 存放主程序
html 存放网站页面 logs 存放日志
------------------------------------------------------------
开启服务并测试
cd /usr/local/nginx
useradd nginx -s /sbin/nologin //创建用户
/usr/local/nginx/sbin/nginx //开启服务
sbin/nginx //使用相对路径开启服务也可以
netstat -ntulp | grep nginx //检测服务是否正常开启
sbin/nginx -V //查看nginx版本以及安装时带了哪些参数和模块
systemctl stop firewalld //关闭防火墙
使用真机的火狐浏览器打开192.168.2.5要看到nginx默认页面
sbin/nginx -s stop //关闭服务
sbin/nginx -s reload //重加载配置文件,服务必须是开启状态
2,测试网站页面:
echo "abc-test~~~" > html/abc.html //创建新页面
http://192.168.2.5/abc.html //访问新页面
火狐访问192.168.2.5/abc.html //如果无效,可以按ctrl+f5强制刷新
测试成品网站页面:
[root@proxy nginx]# yum -y install unzip //安装解压缩工具
[root@proxy nginx]# unzip ~/lnmp_soft/www_template.zip //解压缩网站模板
[root@proxy nginx]# cp -r www_template/* html/ //拷贝网站模板文件
到nginx的网页目录,如果有覆盖提示就输入 y 回车
最后火狐访问192.168.2.5
--------------------------------------------------------------------------------
二,为nginx增加网站认证功能
修改nginx配置文件,在40、41行添加两句
vim conf/nginx.conf
auth_basic "password"; //网页弹出的提示信息,此信息可能会根据
不同浏览器显示效果不一,有的浏览器甚至不显示,但不影响认证功能
auth_basic_user_file "/usr/local/nginx/pass"; //存放网站账户的文件
sbin/nginx -s reload //重加载配置,检验之前配置,没有任何信息即可
yum -y install httpd-tools //之后安装软件包
htpasswd -c pass tom //创建pass文件,里面创建tom账户,之后
会要求输入两次密码
然后用火狐浏览器访问192.168.2.5,可以看到输入用户名密码的对话框、
输入用户名tom以及密码即可
htpasswd pass jerry //追加一个账户,名字是jerry
如果要反复测试网站认证功能,需要清空浏览器的历史记录
--------------------------------------------------------------------------------------
做完上述实验之后,可以按下列方法恢复nginx为默认状态
[root@proxy nginx]# cp conf/nginx.conf.default conf/nginx.conf //恢复nginx配置文件为默认状态
cp:是否覆盖"conf/nginx.conf" ? y
--------------------------------------------------------------------------------------
三,创建虚拟主机
测试【:
httpd
<virtualhost *:80>
servername www.a.com
documentroot /var/www/html
</virtualhost>
<virtualhost *:80>
servername www.b.com
documentroot /var/www/b
</virtualhost>
nginx配置虚拟主机
http {
server { //第1个虚拟主机
listen 80;
server_name www.a.com;
root html;
index index.html;
}
server { //第2个虚拟主机
。。。。
。。。。
}
}
打开nginx主配置文件在34~39行添加:
server {
listen 80; //监听端口号
server_name www.b.com; //域名,默认的虚拟主机改成www.a.com
root html_b; //存放网页的目录
index index.html; //默认页名字
}
sbin/nginx -s reload //之后重新加载配置文件,服务必须是开启状态
[root@proxy nginx]# mkdir html_b //创建b网站的目录
echo "nginx-A~~~" > html/index.html //创建a网站测试页
echo "nginx-B~~~" > html_b/index.html //创建b网站测试页
vim /etc/hosts //修改hosts文件添加ip和域名的映射关系
192.168.2.5 www.a.com www.b.com
curl www.a.com //检测a网站或b网站都可以看到页面
另外:
windows环境配置hosts文件
C:\Windows\System32\drivers\etc\hosts
右键---属性---安全---编辑---users---完全控制打钩
然后用文本打开hosts,在最后添加
192.168.2.5 www.a.com www.b.com
--------------------------------------------------------------------------
四,搭建安全网站
对称算法 AES DES 单机数据加密 使用相同字符串加密和解密
非对称算法 RSA DSA 网络数据加密 利用公钥(锁)加密,私钥(钥匙)解密
信息摘要md5 sha256 数据校验
修改配置,实现安全加密网站
[root@proxy nginx]# vim conf/nginx.conf //修改大概103~120行,如果配置恢复了,就找98~115行
server { //此处的虚拟主机自带ssl安全加密功能,将其范围的注释取消即可
listen 443 ssl;
server_name www.c.com; //这里修改域名
ssl_certificate cert.pem; //证书,包含公钥
ssl_certificate_key cert.key; //私钥
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html_c; //这里修改页面存储目录
index index.html index.htm;
}
}
配置文件修改好之后,再去改/etc/hosts文件添加www.c.com
[root@proxy nginx]# mkdir html_c //创建安全网站的目录
[root@proxy nginx]# echo "nginx-C~~~~" > html_c/index.html //创建安全网站的页面
创建私钥与证书
[root@proxy nginx]# openssl genrsa > conf/cert.key //创建私钥
[root@proxy nginx]# openssl req -x509 -key conf/cert.key > conf/cert.pem
//创建证书,证书中包含公钥,生成过程会询问诸如你在哪个国家之类
的问题,可以随意回答,但要走完全过程
Country Name (2 letter code) [XX]:dc 国家名
State or Province Name (full name) []:dc 省份
Locality Name (eg, city) [Default City]:dc 城市
Organization Name (eg, company) [Default Company Ltd]:dc 公司
Organizational Unit Name (eg, section) []:dc 部门
Common Name (eg, your name or your server's hostname) []:dc 服务器名称
Email Address []:dc@dc.com 电子邮件
启动服务并测试
[root@proxy nginx]# sbin/nginx //服务没开的话开服务
[root@proxy nginx]# sbin/nginx -s reload //已经开了的话重加载配置
[root@proxy nginx]# curl -k https://www.c.com //检验,-k是忽略风险
nginx-C ~~~~ //看到这个内容就说明实验成功
[root@proxy nginx]# systemctl stop firewalld //如果用真机的火狐浏览器测试需要
关闭防火墙,然后输入https://www.c.com 火狐浏览器测试仅限于真机是windows,
目前真机是linux的环境由于配置了dns,所以解析会失败,在linux环境只要用
curl的方式成功即可
=============================================
一, 部署LNMP环境,实现动态网站解析
静态网站 在不同环境下,网站内容不会变化
动态网站 在不同环境下,网站内容有可能发生变化
LNMP 环境
L linux 操作系统
N nginx 网站服务
M mariadb(mysql) 数据库
P php 编写动态网站的语言工具
1,准备nginx以及相关软件包
killall nginx //停止nginx程序
cd /root/lnmp_soft/nginx-1.17.6
rm -rf /usr/local/nginx //删除nginx原有目录
./configure --with-http_ssl_module //配置
make //编译
make install //安装
yum -y install mariadb mariadb-server //安装数据库客户端
与服务端
systemctl start mariadb //开启数据库服务
yum -y install mariadb-devel //安装数据库开发环境依赖包
yum -y install php //安装php,相当于解释器
yum -y install php-fpm //安装可以帮助nginx解析php语言编写的动
态网站的服务
yum -y install php-mysql //安装php与mysql关联的软件包
systemctl start php-fpm //开启php-fpm服务
yum -y install net-tools
netstat -ntulp | grep mysql //检查数据库
netstat -ntulp | grep php-fpm //检查php-fpm服务
用户– 浏览器(或app) html语言 ------------------- 服务器html页面
php 页面 --- php-fpm
2,准备动态网站页面的测试文件
cp ~/lnmp_soft/php_scripts/test.php /usr/local/nginx/html //拷贝动态网站测试页面到nginx中
cd /usr/local/nginx
sbin/nginx //启动nginx服务
打开nginx配置文件,第65到71行去掉注释(可以用:65,71s/#//),69行不用去
location ~ \.php$ { //~是使用正则表达式,匹配以.php结尾
root html; //网站页面位置,不用改,保持默认
fastcgi_pass 127.0.0.1:9000; //一旦用户访问了.php结尾的文
件,就让nginx找后台的php-fpm(端口号9000)
fastcgi_index index.php; //动态网站的默认页面,无需修改
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
//无用行,保持注释状态
include fastcgi.conf; //这里是另外一个配置文件,需要改扩展名
}
---------------------------------------
fastCGI 快速公共(通用)网关接口,可以连接如nginx等网站程序到网站
的语言解释器(比如php)
---------------------------------------
sbin/nginx //开启nginx,如果已经开启就使
用sbin/nginx -s reload 如果均不能正常开启,就用killall nginx然后重新试
使用火狐访问http://192.168.2.5/test.php 可以看到页面内容
测试有数据库的动态网站
cp ~/lnmp_soft/php_scripts/mysql.php /usr/local/nginx/html/ //拷贝另外一个测试页面到nginx
浏览器打开http://192.168.2.5/mysql.php 可以看到网站显示了数据的账户信息
mysql //进入数据库
create user dc@localhost identified by '123'; //创建测试账户
quit; //退出
刷新http://192.168.2.5/mysql.php 可以看到新创建的用户
看到以上test.php、mysql.php两个页面说明nginx不但能识别静态网站,也能解析动态
网站了,这种情况也可以记作nginx实现了动静分离
-------------------------------------------------------------------------
二,地址重写
可以定义用户的访问路径可以看到的实际内容
rewrite 匹配路径 实际看到的页面 选项
地址重写测试1:相同网站不同页面
cp conf/nginx.conf.default conf/nginx.conf //可以先还原配置文件
cp:是否覆盖"conf/nginx.conf"? y
打开配置文件,在38行添加
rewrite /a.html /b.html; //用户访问的路径中包含a.html的话
就跳转到b.html页面
然后准备测试页面
echo "nginx-a~~" > html/a.html
echo "nginx-b~~" > html/b.html
[root@proxy nginx]# sbin/nginx -s reload
使用浏览器访问192.168.2.5/a.html看到的是b.html的内容
地址重写测试2:相同网站不同页面
rewrite ^/a\.html$ /b.html redirect; //在刚刚的配置中添加redirect
sbin/nginx -s reload
使用http://192.168.2.5/a.html路径访问网站时,地址栏同时发生
变化
地址重写测试3:不同网站间跳转
rewrite / http://www.tmooc.cn; //访问192.168.2.5的网站可以
跳转到www.tmooc.cn
sbin/nginx -s reload
地址重写测试4:不同网站间跳转
rewrite /(.*) http://www.tmooc.cn/$1; //访问老网站会跳到新
网站,同时会携带所访问的页面,()是正则,代表保留(复制) $1表示
粘贴之前第一个小括号保留的内容
sbin/nginx -s reload
地址重写测试5:不同浏览器跳转到不同页面
mkdir html/firefox
echo firefox~~ > html/firefox/abc.html
echo others~~ > html/abc.html
火狐专用页面 火狐访问192.168.2.5/abc.html时可以看到html/firefox/abc.html里面内容
其他专用页面 其他访问192.168.2.5/abc.html 时可以看到html/abc.html里面内容
修改配置文件,删除原有地址重写,原地添加
if ($http_user_agent ~* firefox){ //如果用户使用了火狐浏览器
rewrite /(.*) /firefox/$1; //就进行地址重写操作,让用户看到火狐专属页面
}
//$http_user_agent是nginx的内置变量,存储了用户的信息,比如用的什么浏览器
~匹配正则 *忽略大小写
改完后sbin/nginx -s reload
使用火狐浏览器查看192.168.2.5/abc.html可以看到之前html/firefox目录下的页
面,非火狐浏览器打开192.168.2.5/abc.html看到的是html下的页面
--------------------------------------------------
选项
redirect 临时重定向 状态码 302
permanent 永久重定向 状态码 301
以下两种写法对于用户来说效果一样,但是对爬虫程序有区别
rewrite ^/a.html$ /b.html permanent;
rewrite ^/a.html$ /b.html redirect;
分别写完可以用curl 192.168.2.5/a.html 看到状态码
last 不再读其他rewrite
echo "nginx-c~~" > html/c.html //准备素材c页面
rewrite /a.html /b.html last; //不加last的话nginx会把多个rewrite语句综合处理
结果就是看a页面结果跳到c页面了,加了last的话可以避免这个情况
rewrite /b.html /c.html ;
break 不再读其他语句
location / { //此处为默认的location
rewrite /a.html /b.html break; //将last改为break可以阻止后面的语句,此处
如果是last则无法阻止后面location语句中的rewrite语句
root html;
index index.html index.htm;
}
location /b.html { //这里是新添加的location
rewrite /b.html /c.html;
}
结果就是看a页面结果跳到c页面了,加了break的话可以避免这个情况
=============================================
使用nginx代理功能
该功能可以通过组建后台集群提高网站性能
1,环境准备
proxy 2.5
web1 2.100
web2 2.200
检查ip,同网段要互通,检查yum
在web1、web2主机安装常用软件包与网站服务httpd
yum -y install vim net-tools bash-completion psmisc httpd
然后继续准备网站页面
echo "web1~~" > /var/www/html/index.html //创建测试页面,如果是web2
主机的话要写web2~~
systemctl start httpd //然后将web1、web2的服务开启
systemctl stop firewalld //关闭防火墙
回到proxy主机:
[root@proxy nginx]# curl 192.168.2.100 //到proxy主机测试
web1~~
[root@proxy nginx]# curl 192.168.2.200
web2~~
接下来还原proxy主机的nginx
[root@proxy nginx]# cd ~/lnmp_soft/
[root@proxy lnmp_soft]# killall nginx
[root@proxy lnmp_soft]# rm -rf /usr/local/nginx/
[root@proxy lnmp_soft]# rm -rf nginx-1.17.6
[root@proxy lnmp_soft]# tar -xf nginx-1.17.6.tar.gz
[root@proxy lnmp_soft]# cd nginx-1.17.6/
[root@proxy lnmp_soft]#yum -y install gcc make pcre-devel openssl-devel
[root@proxy nginx-1.17.6]# ./configure
[root@proxy nginx-1.17.6]#make
[root@proxy nginx-1.17.6]#make install
2,修改nginx配置文件实现集群功能
[root@proxy nginx]# vim conf/nginx.conf
upstream web { //首先是34~37行,创建集群,集群名称叫web
server 192.168.2.100:80; //这里是集群中的服务器ip与端口
server 192.168.2.200:80; //第二台集群主机
}
server {
listen 80;
。。。。
location / {
proxy_pass http://web; //在第47行,调用集群
root html;
index index.html index.htm;
}
之后开启nginx或者重加载nginx配置,用curl 192.168.2.5可以看到 web1
或web2页面轮询出现
二,集群优化
调节权重定义集群主机任务的分配量
server 192.168.2.200:80 weight=2; //为性能较强的集群主机配置权重
,权重越大任务的分配量就越大
[root@proxy nginx]# curl 192.168.2.5
web2~~
[root@proxy nginx]# curl 192.168.2.5
web2~~
[root@proxy nginx]# curl 192.168.2.5
web1~~
配置健康检查
server 192.168.2.200:80 max_fails=2 fail_timeout=30; //检测两次如果失败
,则认为集群中的主机故障,之后等待30秒再次测试
sbin/nginx -s reload
测试时,先将web2的httpd服务关闭,回到proxy访问集群页面curl 192.168.2.5
只会显示web1的页面,此时即使将web2的httpd服务开启也无效,因为要等
待30秒
3,相同客户机访问相同服务器
upstream web {
ip_hash; //相同客户机访问相同服务器,让一个客户机访问集群时锁定
一个后台服务器,避免重复登陆的问题
server 192.168.2.100:80;
server 192.168.2.200:80;
}
sbin/nginx -s reload
curl 192.168.2.5 //重加载配置后访问2.5只会看到一个网站的页面
4,添加down标记
upstream web {
server 192.168.2.100:80;
server 192.168.2.200:80 down; //down标记可以让集群主机暂时不参与集群活动
}
sbin/nginx -s reload
curl 192.168.2.5
-----------------------------------------------------------------------------
nginx功能
网站服务,网站代理,四层代理
三,使用nginx创建其他业务集群(四层代理)
[root@proxy nginx]# cd ~/lnmp_soft/nginx-1.17.6/
[root@proxy nginx-1.17.6]# killall nginx
[root@proxy nginx-1.17.6]# rm -rf /usr/local/nginx/
./configure --with-stream --with-http_stub_status_module
//这里的--with-stream 是添加四层代理模块,可以用来创建其
他业务集群,--with-http_stub_status_module是后面实验所需模块
make //编译
make install //安装
cd /usr/local/nginx/
sbin/nginx -V //查看安装模块情况
打开nginx主配置文件,在16行左右(http上面),添加以下内容
stream { //创建新业务
upstream backend { //创建名叫backend的集群
server 192.168.2.100:22; //集群中的主机使用22端口对外提供服务
server 192.168.2.200:22;
}
server {
listen 12345; //监听端口号
proxy_pass backend; //调用集群
}
}
sbin/nginx //配置写好之后开启服务或者重加载配置文件
ssh 192.168.2.5 -p 12345 //尝试远程登录,第一次可能会连接集群的某一台主机比如web1
exit //退出
[root@proxy nginx]# rm -rf ~/.ssh/known_hosts //删除记录文件
ssh 192.168.2.5 -p 12345 //再次尝试登录,会连接到另外一台集群主机
------------------------------------------------------------------------
ss命令可以查看系统中启动的端口信息,该命令常用选项如下:
-a显示所有端口的信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
注意:在RHEL7系统中可以使用ss命令替代netstat命令,功能一样,选
项一样。
---------------------------------------------------------------------
常见nginx问题处理
1,404报错
error_page 404 /test.jpg; //如果客户访问了不存在的页面就显
示test.jpg的内容
sbin/nginx -s reload //重加载配置
然后找一个图片扔到/usr/local/nginx/html里面,命名为test.jpg
使用浏览器虽随意访问不存在的页面192.168.2.5/XXXX.html 就可以看到之前
那张图片的内容
如果真机是windows可以用mobaXterm传test.jpg文件到nginx的html目录
如果真机是linux可以用scp命令
2,查看网站后台数据
--with-http_stub_status_module //该功能利用的模块,之前配置nginx已经安装
打开配置文件
location /status { //在error_page行上面添加此内容
stub_status on;
allow 192.168.2.5; //只允许2.5查看
deny all; //拒绝其他
}
sbin/nginx -s reload //重加载配置
使用浏览器查看192.168.2.5/status
Active connections:当前活动的连接数量(当前有多少用户访问该网站)。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量。
Requests:客户端发送的请求数量。
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。
=============================================
一,nginx问题处理
缓存文件在客户端
用户如果反复访问服务器的相同文件可以缓存到客户机,避免
服务器反复传送相同文件,节约时间
打开配置文件,在默认的location下面添加一个location
location ~* \.(jpg|html|txt|mp3)$ { //当发现用户访问的是
以.jpg或者.html等等结尾的页面时
expires 30d; //就把上述访问的文件在客户机缓存30天
}
sbin/nginx -s reload //配置完后重加载配置文件
使用火狐浏览器清空历史记录,然后访问192.168.2.5/test.jpg
然后地址栏输入about:cache
查看disk文件的列表,找到被访问文件看最后倒数第2列(Expires)
信息显示多久过期可以看到该文件的过期时间是一个月之后,说明
缓存成功。
----------------------------------------------------------
2,支持超长地址栏
默认情况下nginx无法支持长地址栏,会报414错误
打开配置文件,在默认的虚拟主机上方添加两行
client_header_buffer_size 200k; //第一行表示,用户访问网站的头部信
息(包含地址栏)长度支持200k大小
large_client_header_buffers 4 200k; //第二行表示,如果200k不够,再
给4个200k
sbin/nginx -s reload //重加载配置
然后到lnmp_soft目录找到buffer.sh 脚本并运行(该脚本里的4.5可以修改为2.5),
看不到414报错即可./buffer.sh //执行测试脚本,可以支持超长地址栏并看到页
面内容,而不是414报错
----------------------------
上述脚本中地址的重新赋值过程如下,最终会产生常超地址
URL=http://192.168.4.5/index.html?
URL=http://192.168.4.5/index.html?v1=1
URL=http://192.168.4.5/index.html?v1=1v2=2
URL=http://192.168.4.5/index.html?v1=1v2=2v3=3
URL=http://192.168.4.5/index.html?v1=1v2=2v3=3.......................v5000=5000
-------------------------------------------------------------------------
3,优化nginx并发
用proxy 和web1
防火墙与selinux都关闭
[root@web1 ~]# yum -y install httpd-tools
ab -c 200 -n 200 http://192.168.2.5/ //用压力测试工具模拟200人,每人1次,一共200次对2.5的网站发起访问,成功
ab -c 2000 -n 2000 http://192.168.2.5/ //模拟2000人,每人1次,一共2000次
对2.5的网站发起访问,失败
接下来进行优化
在proxy主机:
打开nginx配置文件修改第3行,第13行-
worker_processes 2; //开启的nginx进程数量,通常是随cpu的核心数一致
worker_connections 50000; //每个nginx进程支持的并发访问量
sbin/nginx -s reload
proxy与web1都执行以下命令
ulimit -n //查询系统打开文件数量的大小
ulimit -n 100000 //临时定义文件可以同时被打开的次数为10万
回到web1主机执行命令ab -c 2000 -n 2000 http://192.168.2.5/ 看到100%则
成功
--------------------------------------
vim /etc/security/limits.conf //打开配置文件实现永久修改
修改第53、54行
* soft nofile 100000
* hard nofile 100000
-----------------------------------------------------------------------------------
二,解决集群主机过多而导致用户重复登陆网站的问题
在一个集群中,如果网站需要用户输入用户名和密码登陆之后才能继续访问,那么当用户登陆其中一台集群主机之后随着继续访问页面,请求可能被代理服务器轮询到另外一台服务器上,那么对于另外一台服务器来说用户并没有登陆,想查看登陆之后的页面还需要再次登陆,这样集群主机越多需要客户重复登陆的次数就越多
1,按照下列需求部署好环境
proxy web1 web2
nginx lnmp lnmp
在proxy主机家目录下将lnmp_soft.tar.gz拷贝到web1
[root@proxy ~]# scp lnmp_soft.tar.gz 192.168.2.100:
首先在web1主机:
yum -y install gcc make pcre-devel openssl-devel
[root@web1 ~]# tar -xf lnmp_soft.tar.gz
[root@web1 ~]# cd lnmp_soft/
tar -xf nginx-1.17.6.tar.gz
cd nginx-1.17.6/
./configure //配置
make //编译
make install //安装
yum -y install mariadb mariadb-server mariadb-devel //安装数据库
相关软件包
yum -y install php php-mysql php-fpm //安装php相关软件包
systemctl start mariadb
systemctl start php-fpm
[root@web1 nginx]# vim conf/nginx.conf //修改配置文件,实现动静分离,
修改65~71行为以下状态
vim conf/nginx.conf //修改配置文件,实现动静分离,修改65~71行为以下状态
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
配置好lnmp之后
[root@web1 nginx]# systemctl stop httpd
[root@web1 nginx]# sbin/nginx //开启服务
配置好lnmp之后
cd ~/lnmp_soft/php_scripts/
tar -xf php-memcached-demo.tar.gz //释放带登录功能的网页
cp -r php-memcached-demo/* /usr/local/nginx/html/ //拷贝页面
到nginx中使用火狐浏览器访问http://192.168.2.100/index.php 可以
看到有登录界面的网页
web1配置好之后,web2也按照一模一样的过程配置,防火墙都要关闭
2,然后在proxy主机配置集群,注意该主机不能有动静分离的配置
upstream web { //在默认的虚拟主机上面添加集群
server 192.168.2.100:80;
server 192.168.2.200:80;
}
location / {
proxy_pass http://web; //然后在默认的虚拟主机中的location里调用集群
sbin/nginx -s reload //重新加载配置文件
http://192.168.2.5/index.php //之后测试效果,不断刷新页面,会看到web1与
web2的登录界面(需要提前在web1与web2的index.php页面进行标记)
注意!proxy主机不要配置动静分离
---------------------------------------------------------------------
Session 存储在服务器端,保存用户名、登录状态等信息
Cookies 由服务器下发给客户端,保存在客户端的一个文件
保存的主要内容是sessionID
index.php 登录前页面
home.php 登录后页面
客户 Cookies ------ proxy ------ web1 Session
------ web2 Session
目前环境搭建好之后可以按以下步骤测试:
删除web1与web2的session文件
rm -rf /var/lib/php/session/*
删除火狐浏览器的历史记录(主要是cookies文件)
http://192.168.2.5/index.php //登录2次才能成功,目前登录2次是正常现象!!
------------------------------------------------------------------
上述实验由于web1与web2都是在各自的/var/lib/php/session目录中存储session,所以造成客户需要重复登录,为了统一session存储的位置(该存储方式通常被称为session共享),需要安装专门的数据库工具
memcache 可以利用内存读写数据的数据库服务
proxy主机:
yum -y install memcached telnet //安装软件包
systemctl start memcached //开启服务
telnet 127.0.0.1 11211 //连接memcache,进行检测
之后测试memcached:
set abc 0 200 3 //创建变量abc(如果abc已经存在就是覆盖),0是不压
缩数据,数据存储时间200秒,存3个字符,回车之后比如输入xyz就是存储
这3个字符
get abc //获取变量abc
replace abc 0 200 3 //覆盖abc,此时变量abc必须存在
delete abc //删除abc
add xyz 0 200 3 //添加abc变量,如果abc已经存在则会添加失败
flush_all //删除所有数据
quit //退出
到web1与web2主机修改存储session文件的位置
vim /etc/php-fpm.d/www.conf //到最后一页
php_value[session.save_handler] = memcache //这里改成memcache,表示session
的存储不在是本地的普通文件,而是去找memcache
php_value[session.save_path] = tcp://192.168.2.5:11211 //这里的路径修改为
安装了memcache服务的服务器地址与端口
yum -y install php-pecl-memcache //安装php与memcached服务关联的软件包
systemctl restart php-fpm
所有主机关闭防火墙和selinux
最后清空浏览器的历史记录,再访问http://192.168.2.5/index.php仅仅登录一次即
可成功
=============================================
一,使用tomcat搭建网站服务
cd ~/lnmp_soft/
tar -xf apache-tomcat-8.0.30.tar.gz
cp -r apache-tomcat-8.0.30 /usr/local/tomcat
cd /usr/local/tomcat/
yum -y install java-1.8.0-openjdk
tomcat目录:
bin 存放主程序
logs 存放日志
conf 配置文件
webapps 存放网站页面
lib 存放库文件
work 存放编译后页面文件
[root@proxy tomcat]# bin/startup.sh //开启服务
http://192.168.2.5:8080/ //使用火狐访问
netstat -ntulp | grep java //检查如果有8005、8009、8080端口
则正常
由于tomcat服务开启时需要大量随机字符,但系统中随机字符
不够多的话会导致tomcat服务启动失败
解决方案1:
mv /dev/random /dev/random.bak //将random改名
ln -s /dev/urandom /dev/random //用urandom替换random
解决方案2:
yum -y install rng-tools
systemctl start rngd
killall java //杀掉所有java程序
[root@proxy tomcat]# bin/startup.sh //重新开启服务
netstat -ntulp | grep java
测试静态页面:
cd /usr/local/tomcat
echo "tomcat-test~~~~" > webapps/ROOT/test01.html
http://192.168.2.5:8080/test01.html 火狐访问测试
测试动态页面
vim webapps/ROOT/test02.jsp
<html>
<body>
<center>
Now time is: <%=new java.util.Date()%>
</center>
</body>
</html>
-----------------------------------------------------------
使用tomcat创建虚拟主机
回顾,
httpd搭建虚拟主机
<virtualhost *:80>
servername www.a.com
documentroot /var/www/html
</virtualhost>
nginx搭建虚拟主机
http {
server {
listen 80;
server_name www.a.com;
root html;
index index.html;
}
}
tomcat搭建虚拟主机
<Host name=域名appBase=网站页面位置 >
</Host>
vim conf/server.xml //打开配置文件在122行添加虚拟主机配置
<Host name="www.b.com" appBase="web_b">
</Host>
mkdir -p web_b/ROOT //之后创建b网站的目录
echo "tomcat-A~~~" > webapps/ROOT/index.html
echo "tomcat-B~~~" > web_b/ROOT/index.html
tail -1 /etc/hosts //查看域名解析
192.168.2.5 www.a.com www.b.com www.c.com
bin/shutdown.sh //关闭tomcat
bin/startup.sh //开启
[root@proxy tomcat]# curl www.a.com:8080 //测试
tomcat-A~~~
[root@proxy tomcat]# curl www.b.com:8080
tomcat-B~~~
再次修改虚拟主机配置
<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true"> //添加unpackWARs自动
解war包,和autoDeploy可以自动更新开发工程师编写的网站功能代码
</Host>
bin/shutdown.sh //然后重启tomcat
bin/startup.sh //开启服务
netstat -ntulp | grep java //检查
yum -y install java-1.8.0-openjdk-devel //安装可以制作war包的工具
jar -cf b.war /var/log //之后可以使用jar命令打war包
cp b.war web_b/ //将war包放入虚拟主机的网页目录
ls web_b/ //检查,可以看到已经自动解开
-----------------------------------------------------------------
tomcat访问路径与页面位置
Context path 匹配用户访问路径
docBase 定义页面位置
测试1:
<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="" />
</Host>
echo "web_b/ROOT/index.html" > web_b/ROOT/index.html //默认页面路径
echo "web_b/index.html" > web_b/index.html //创建素材,定义新路径
curl www.b.com:8080 //测试可以看到的是默认的页面路径
web_b/ROOT/index.html
之后重启tomcat
curl www.b.com:8080 //重启后测试可以看到新路径
web_b/index.html
测试2:
<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="abc" /> //修改成abc
</Host>
mkdir web_b/abc //创建测试目录
echo "web_b/abc/index.html" > web_b/abc/index.html //测试页面
重启tomcat
[root@proxy tomcat]# curl www.b.com:8080 //查看,见到新路径
web_b/abc/index.html
测试3:
<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/abc" /> //修改成/abc
</Host>
mkdir /abc //创建测试目录
echo "/abc/index.html" > /abc/index.html //创建测试文件
重启tomcat
[root@proxy tomcat]# curl www.b.com:8080 //得到新路径
/abc/index.html
测试4:
<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/abc" /> //path后面添加内容可以匹配
用户访问路径,当用户访问www.b.com:8080/test/时,看到的是/abc的内容,如果
访问www.b.com:8080就看到web_b/ROOT的内容
</Host>
重启tomcat
[root@proxy tomcat]# curl www.b.com:8080/test/
/abc/index.html
[root@proxy tomcat]# curl www.b.com:8080
web_b/ROOT/index.html
测试5:
<Host name="www.b.com" appBase="web_b"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="abc" /> //将/abc改成abc
当用户访问www.b.com:8080/test/时,可以看到web_b/abc里的内容
当用户访问www.b.com:8080时就看到web_b/ROOT的内容
重启tomcat
[root@proxy tomcat]# curl www.b.com:8080/test/
web_b/abc/index.html
[root@proxy tomcat]# curl www.b.com:8080
web_b/ROOT/index.html
---------------------------------------------------------------------------------
给新创建的虚拟主机添加日志功能
vim conf/server.xml //修改配置文件,复制最后一页默认虚拟主机的日志配置
其中prefix是日志名称,suffix是日志后缀名
<Host name="www.b.com" appBase="test01"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="a" />
<Context path="/abc" docBase="/var/www/html" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="www_b_com" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
配置好之后开启或者重启tomcat服务
curl www.b.com:8080 //访问一次网站,可以产生日志记录
[root@proxy tomcat]# ls logs/ 查看日志目录可以看到b网站的日志名称
--------------------------------------------------------------------------
maven 是一个项目管理工具
1, 将三个文件传入虚拟机root的家目录,原地释放
apache-maven-3.6.3-bin.tar.gz //maven工具包
cms.tar.gz //网站项目,代码已经都编写完毕
m2.tar.gz //依赖程序,释放之后是隐藏目录.m2
2,配置maven
mv apache-maven-3.6.3 /usr/local/maven //将maven移动到/usr/local下
yum -y install java-1.8.0-openjdk
yum -y install java-devel
vim /usr/local/maven/conf/settings.xml //打开配置文件在第158下面添加
公网服务器地址
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
3,配置数据库
yum -y install mariadb mariadb-server
systemctl start mariadb
[root@proxy ~]# cd ~/CMS/
cp src/main/resources/shishuocms.properties . //拷贝网站数据库
配置文件到当前目录,该文件定义了数据的用户名和密码等信息
mysql -uroot -p < sql/install.sql //导入网站相关数据库文件
Enter password: 直接回车
mysqladmin password //修改数据库密码
New password: //接下来输入12345678
Confirm new password: //在输入一次12345678
4,利用maven打包项目
/usr/local/maven/bin/mvn clean package //按照之前定义的
公网服务器地址、数据库配置等内容打包项目
rm -rf /usr/local/tomcat/webapps/ROOT //删除原有默认页面目录
cp target/shishuocms-2.0.1.war /usr/local/tomcat/webapps/ROOT.war //将新
项目移动到tomcat中,然后会自动解包
打开浏览器访问www.a.com:8080看到“师说”页面则成功
如果tomcat恢复默认了,就打开浏览器访问192.168.2.5:8080
WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
目录
一、下载地址
二、安装教程
(1)首先解压jar包
(2)打开目录中的Disk/install安装目录,找到名为ng.cmd的脚本文件
(3)跳过自动更新,点击下一步
(4)设置安装目录,进入下一步
(5)选择WebLogic Server(W),进入下一步
(6)点击安装
(7)等待安装进度条到到100%,点击下一步
三、WebLogic的配置
(1)安装完毕之后,会弹出配置窗口,我们按照以下操作进行配置:
(2)配置登录账号和密码
(3) 全选所有选项,进入下一步
(4)默认即可,进入下一步
(5)节点管理器身份证明
(6)点击下一步
(7)选择创建
一、下载地址
下载地址:https://www.aliyundrive.com/s/QQUVTGzZFmo
二、安装教程
(1)首先解压jar包
(2)打开目录中的Disk/install安装目录,找到名为ng.cmd的脚本文件
双击打开脚本文件,弹出一个黑色的控制台
稍等一会儿,就会进入到WebLogic的安装界面
(3)跳过自动更新,点击下一步
(4)设置安装目录,进入下一步
(5)选择WebLogic Server(W),进入下一步
(6)点击安装
(7)等待安装进度条到到100%,点击下一步
三、WebLogic的配置
(1)安装完毕之后,会弹出配置窗口,我们按照以下操作进行配置:
(2)配置登录账号和密码
(3) 全选所有选项,进入下一步
(4)默认即可,进入下一步
(5)节点管理器身份证明
(6)点击下一步
(7)选择创建
==============================================================================
Kettle从Windows环境迁移至Linux环境
kettle应用之前部署在window环境,作为开发环境。由于公司网络安全管理规定,要求kettle正式环境需要部署在linux环境下。因此需要进行环境迁移。
一、部署linux环境;
对于正式应用,建议新增单独用户,用来部署kettle和运行kettle
二、安装jdk;
建议安装jdk1.8.192,最后一个免费版本,避免引起版权问题
三、下载最新版本pdi,并ftp到linux环境的用户目录下
kettle目前已经更名为pdi,下载地址:kettle各个版本下载地址
kettle下载的文件直接在linux环境解压即可。
需要注意,解压后的文件,需要对kettle主目录下的.sh文件附加执行命令
chmod +x *.sh
建议下载最新版本,20211117目前最新版本是9.2
四、修改.kettle文件夹中的配置文件
window开发环境中,第一次运行kettle时,系统会自动在当前用户目标增加一个.kettle的文件夹。里面有2个重要的文件,在迁移前需要复制修改。
第一个文件是kettle.properties,里面存储了kettle应用的全局变量信息。在迁移到linux环境前,需要对里面的全局变量的对应文件目录进行修改,修改为linux环境project的相关目录;
第二个文件是shared.xml,里面存储了加密后的数据资源库配置信息,包括地址、用户、密码等,此文件一般无需修改,直接ftp到linux部署环境即可。
linux环境下,.kettle文件夹位于kettle的安装主目录data-integration下,是一个隐藏文件。
里面对应的2个文件就是window下.kettle文件夹的相关文件。
五、修改linux系统当前用户的.profile文件增加kettle目录,避免无法直接执行pan,kitchen等命令
由于kettle的正式环境是需要通过crontab命令调用定时任务的,所以需要对主目录下pan等命令文件进行重写DIR目录,将原来的相对目录地址改为绝对目录地址。
六、重新shell文件,增加配置信息
crontab命令执行是不载入用户配置变量信息的,所以无法通过crontab命令来直接执行pan等命令,需要新增一个shell文件,在shell文件中执行pan等命令。
#!/bin/bash
cd /prog/nanjA/kettle/data-integration
#需要导入jdk路径
export KETTLE_HOME=/prog/nanjA/kettle/data-integration
export JAVA_HOME=/usr/java/jdk1.8.0_192-amd64
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin:$KETTLE_HOME
#通过kitchen运行作业,每次运行产生一个日志
./pan.sh -file=/prog/nanjA/kettlework/sproject/A_Mob/dev/operateprpcmain.ktr -level=Basic >>/prog/nanjA/kettlework/slogfile/operateprpcmain_$(date "+%Y%m%d-%H%M%S").log
设置crontab,具体方法crontab -e,
===================================================================
一、ETL简介
ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,它是构建数据仓库的重要环节,但其对象并不限于数据仓库。
注:数据仓库是面向主题的、集成的、稳定的且随时间不断变化的数据集合,用以支持经营管理中的决策制定过程。
二、Kettle简介
(1)含义:Kettle的中文名称叫做水壶,该项目的主程序员Matt,希望把各种数据放到一个壶里,然后以一种指定的格式流出。
(2)背景:国外开源的ETL工具,纯Java编写
(3)运行平台:
服务器端支持:Windows Server, CentOS, RHEL, Ubuntu
开发客户端支持:Windows, Ubuntu Desktop, MacOS
浏览器端支持:Internet Explorer, Chrome, Firefox, Safari, Edge
可以在本地运行,也可以连接远程机器运行
(4)操作界面:图形化操作界面,同时也支持脚本编写开发
三、Kettle安装步骤
1.Java环境准备
由于 Kettle 是基于 java 的,因此需要安装 java 环境,并配置 JAVA_HOME 环境变量。
建议安装 JDK1.8 及以上,7.0以后版本的 Kettle 不支持低版本 JDK。
(1)如不知道自己电脑是否配置了java环境,可以先通过命令窗口检验,在键盘上同时按住Win+R,弹出运行窗口,输入cmd,回车进入
(2)输入java -version,看是否显示出版本信息,如未出现以下截图中的内容,说明未安装
已安装截图:
(3)下载jdk安装包,以window64为例
下载地址:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html
(4)打开安装包,开始安装,一直点击下一步即可,直到显示安装完成,退出即可
(5)配置环境中心(以win10为例)
点击我的电脑->属性->高级系统设置->环境变量
【1】新建JAVA_HOME变量,变量值为jdk的安装目录
【2】编辑CLASSPATH变量,变量值为:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tool.jar
【3】编辑Path变量,添加变量的值为%JAVA_HOME%\bin
(6)测试:再次重复(1)~(2)步,在命令框里输入java -version,回车后显示版本信息则说明安装成功
2.Kettle下载与安装
(1)下载地址:https://sourceforge.net/projects/pentaho/files/Data%20Integration/
(2)进入网站,可以选择现最新版本,也可以选择历史版本,选择最新版下载即可(此步将花费较长时间,建议至少空出3个小时以上的时间进行下载)
(3)将压缩包解压,找到spoon.bat,双击即可启动,如果经常用,建议右键创建快捷方式至桌面
3.mysql驱动下载与配置
(1)下载地址:https://downloads.mysql.com/archives/c-j/
(2)进入网站后可以选择下载版本以及操作系统
Product Version:选择你想下载的版本及可
Operating System :选择Platform Independen
(3)下载下方的zip文件,进行解压
(4)找到kettle的安装路径,再进入到lib文件夹下,将驱动包放到lib文件夹中
四、测试
(1)双击Spoon.bat,即启动Kettle
(2)双击会显示以下界面,要等待较长时间
(3)进去后选择File(文件)->New(新建)->Database Connection(数据库连接)
填写所要连接的数据库的基本信息,点击下方test,弹出测试成功的对话框即为成功
以上,Kettle就已安装配置完毕,连接好数据库后就可以根据你的需要来建立转换和作业
eureka与nacos
相对来说。一个服务既可以是提供者也可以是消费者。
Eureka注册中心
服务调用出现的问题
不能硬编码
服务消费者该如何获取服务提供者的地址信息?
服务提供者启动时向Eureka注册自己的信息
Eureka保存这些信息
消费者根据服务名称向Eureka拉取提供者信息
如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法从服务列表中挑选一个
消费者如何得知服务提供者的健康状态?
服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
Eureka会更新记录服务列表信息,心跳不正常会被剔除
消费者就可以拉取到最新的信息
Eureka 的作用
在Eureka架构中,微服务角色有两类:
EurekaServer:服务端,注册中心
记录服务信息
心跳监控
EurekaClient:客户端
Provider:服务提供者,例如案例中的user-service
注册自己的信息到EurekaServer
每隔30秒向EurekaServer发送心跳
consumer:服务消费者,例如案例中的order-service
根据服务名称从EurekaServer拉取服务列表
基于服务列表做负载均衡,选中一个微服务后发起远程调用
动手实践
搭建EurekaServer
搭建EurekaServer服务步骤如下:
创建项目,引入spring-cloud-starter-netflix-eureka-serverl的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
1
2
3
4
编写启动类,添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EuerkaApplication {
public static void main(String[] args) {
SpringApplication.run(EuerkaApplication.class, args);
}
}
1
2
3
4
5
6
7
8
9
添加application.yml文件,编写下面的配置:
server:
port: 10086
spring:
application: # eureka的服务名称
name: eurekaserver
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
1
2
3
4
5
6
7
8
9
10
注册user-service
将user-service服务注册到EurekaServer步骤如下:
在user-service项目引入spring-cloud-starter-netflix-eureka-client的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
1
2
3
4
在application.yml文件,编写下面的配置:
server:
port: 8081
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
1
2
3
4
5
6
7
8
9
注册order-service同上
在order-service完成服务拉取
服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡
修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口:
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
// 4.返回
return order;
}
1
2
3
4
5
6
7
8
9
在order–service.项目的启动类OrderApplication中的RestTemplate添加负载均衡注解:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
1
2
3
4
5
实现负载均衡
Ribbom负载均衡
负载均衡原理
负载均衡流程
loadBalabcerInterceptor实现ClientHttpRequestInterceptor接口,用于拦截客户端http请求
跟this.loadBalancer.execute()方法
ILoadBalancer loadBalancer = getLoadBalancer(serviceId); // 根据服务名称到eureka中拉取服务列表
1
Server server = getServer(loadBalancer, hint);
// getServer方法
protected Server getServer(ILoadBalancer loadBalancer, Object hint) {
if (loadBalancer == null) {
return null;
}
// Use 'default' on a null hint, or just pass it on?
return loadBalancer.chooseServer(hint != null ? hint : "default");
}
1
2
3
4
5
6
7
8
9
10
跟chooseServer方法
IRule的实现类
拿到server的host
负载均衡策略
Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则:
通过定义IRule:实现可以修改负载均衡规则,有两种方式:
代码方式:在order–service中的OrderApplication类中,定义一个新的IRule:由轮询变成随机
/**
* 全局的负载均衡策略
* @return
*/
@Bean
public IRule randomRule() {
return new RandomRule();
}
1
2
3
4
5
6
7
8
配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
# 针对微服务名称的负载均衡策略
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
1
2
3
4
懒加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载侧会在项目启动时创建,降低第一次访问的耗时,、通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients:
- userservice #指定对userservice这个服务饥饿加载
1
2
3
4
5
Nacos注册中心
认识Nacos
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
控制台:
服务注册到Nacos
在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
1
2
3
4
5
6
7
注释掉order-service和user-service中原有的eureka依赖
添加nacos的客户端依赖:
<!-- nacos客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1
2
3
4
5
修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址:
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos服务端地址
1
2
3
4
启动并测试
Nacos服务分级存储模型
**一级:**服务
**二级:**集群
**三级:**实例
服务跨集群调用问题
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
本地集群不可访问时,再去访问其它集群
服务集群属性
修改application.yml,添加如下内容:
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos服务端地址
discovery:
cluster-name: yulin # 配置集群名称,也就是机房的位置
# 再起一个在mizhi集群的实例
1
2
3
4
5
6
7
8
在Nacos控制台可以看到集群变化:
根据集群负载均衡
修改order-servicer中的application.yml,设置集群为yulin:
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos服务端地址
discovery:
cluster-name: yulin # 配置集群名称,也就是机房的位置
1
2
3
4
5
6
然后在order-service中设置负载均衡的Rule为NacosRule,这个规则优先会寻找与自己同集群的服务(本地实
例随机访问):
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
1
2
3
注意将user-servicel的权重都设置为1
注意:如果本地集群实例都挂掉,那么就会访问其他集群(输出警告日志)
04-26 18:55:44:182 WARN 16752 --- [nio-8080-exec-3] c.alibaba.cloud.nacos.ribbon.NacosRule : A cross-cluster call occurs,name = userservice, clusterName = yulin, instance = [Instance{instanceId='172.28.74.89#8084#mizhi#DEFAULT_GROUP@@userservice', ip='172.28.74.89', port=8084, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='mizhi', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]
1
根据权重负载均衡
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请
求
Nacos控制台可以设置实例的权重值,0~1之间
同集群内的多个实例,权重越高被访问的频率越高
权重设置为0则完全不会被访问
环境隔离-namespace
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
在Nacos控制台可以创建namespace用来隔离不同环境
然后填写一个新的命名空间信息:
保存后会在控制台看到这个命名空间的id:
修改order–service的application.yml,添加namespace:
spring:
cloud:
nacos:
server-addr: 82.157.9.110:8848 # nacos服务端地址
discovery:
cluster-name: yulin # 配置集群名称,也就是机房的位置
namespace: 8eda2a78-bf58-41d9-a559-91b1f2d26369 # 命名空间的ID
1
2
3
4
5
6
7
重启order-service后,再来查看控制台:
此时访问order-service,因为namespace不同,会导致找不到userservice控制台会报错:
① namespace用来做环境隔离
② 每个namespace都有唯一id
③ 不同namespace下的服务不可见
nacos注册中心细节分析
注意:临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会
临时实例和非临时实例
服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 为非临时实例
1
2
3
4
5
Nacos与eureka
Nacos与eureka的共同点
(1)都支持服务注册和服务拉取
(2)都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别
(1)Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
(2)临时实例心跳不正常会被剔除,非临时实例则不会被剔除
(3)Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
(4)Nacos集群默认采用AP方式(强调数据的可用性),当集群中存在非临时实例时,采用CP模式(强调数据的可靠性和一致性);Eureka采用AP方式
————————————————
版权声明:本文为CSDN博主「愿你一世安呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44744094/article/details/124456315
什么是fastdfs、fastdfs简单介绍
fdfs分布式文件存储系统
https://blog.csdn.net/weixin_37692315/article/details/106693067源码包下载地址
https://blog.csdn.net/MssGuo/article/details/119046419
https://blog.csdn.net/MssGuo/article/details/119046419
https://blog.csdn.net/IT12345666/article/details/117230776
http://www.bjpowernode.com/hot/2402.html
https://blog.csdn.net/yk950309/article/details/118879144
什么是FastDFS
FastDFS 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和提交均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等 。FastDFS 为互联网专业定制,充分考虑了统计数据、负载均衡、扩大容容等,指标并适当高准、合适等。使用FastDFS很容易建立起自己的文件服务器,提供文件、下载等服务。
FastDFS的3个角色
1 )客户端
2 ) tracker追踪服务器
3 )存储存储服务器
原理步骤:客户端请求----追踪服务器----给客户端分配一个组----最终客户端将数据写入组中。
客户端:Client,客户端,主要是上传下载文件数据,包括我们部署的应用服务器或浏览器等。
跟踪服务器:tracker server,跟踪服务器主要负责调度工作,起到了负载均衡的效果,负责管理所有的storage server 和group,每个storage在启动后都会链接Tracker,storage server会定期的向tracker server发送自己的状态信息,如告知自己所属的group等信息,并保持周期性心跳,Tracker是连接客户端与组和存储枢纽,Tracker server也可以时多台的、集群的。
存储服务器:storage server,存储服务器负责存储数据和备份,存储服务器以group为单位,每个组又可以又多个storage server,组内的storage server数据互为备份。
以上,tracker server就起到了负载均衡的作用,storage server由于同一个组内的server互为备份,所以storage server就起到了数据冗余备份的作用。
FastDFS上传机制
如上图,当tracker收到客户端的上传文件的请求时,tracker会去storage查询可用的group,并返回给客户端storage的IP和端口,即group等信息,客户端向storage发送写文件请求,storage将会分配一个数据目录,然后为文件生成一个file_id,存储路径,文件名并存储文件,storage返回file_id、路径和文件给客户端。
FastDFS下载机制
FastDFS文件同步机制
写文件时,客户端将文件写至group内的一个storage server即认为写入成功,storage server写完后将由后台线程将文件同步到group内的其他storage server,实现原理是:每个storage 写文件后会同时写一份binlog,binlog不包含数据,只包含文件名等元数据,这份binlog用于后台同步,storage 会记录group内其他的storage 同步进度,一遍重启后能衔接上次的同步进度继续同步,进度以时间戳的方式记录,所以最好保证集群内的server时间一致。
https://blog.csdn.net/IT12345666/article/details/117230776
https://blog.csdn.net/weixin_53998054/article/details/126088224
https://blog.csdn.net/weixin_37692315/article/details/106693067 包地址