nginx应用及优化

=============================================

一,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 包地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值