Nginx+FastDFS

1.nginx

1.什么是nginx

Nginx是一个高性能的Web和反向代理服务器,它具有有很多非常优越的特性:

作为Web服务器:相比Apache,Nginx使用更少的资源,支持更多的并发连接,体现更高
的效率,这点使Ngx尤其受到虚拟主机提供商的欢迎。能钩够支持高达50,000个并发连接数
的响应,感谢Nginx为我们选择了epoll and kqueue作为开发模型.

作为负载均衡服务器:Nginx既可以在内部直接支持Rails和PHP,也可以支持作为HTTP代
理服务器对外进行服务。Ngx用C编写,不论是系统资源开销还是CPU使用效率都比
Perlbal要好的多。

作为邮件代理服务器:Nginx同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的
目的之一也是作为邮件代理服务器),Lāst.fm描述了成功并且美妙的使用经验。

Nginx安装非常的简单配置文件非常简洁(还能钩够支持Derl语法),Bugs非常少的服务
:Ng×启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新
启动。你还能够在不间断服务的情况下进行软件版本的升级。

nginx可以作为web服务器,但更多的时候,我们把它作为网关,因为它具备网关必备的功能

  • WEB服务器(静态服务器)
  • 反向代理
  • 负载均衡
  • 动态路由
  • 请求过滤

2.nginx作为服务器

1.web服务器的分类

  • web应用服务器,如:
    • tomcat
    • resin
    • jetty
  • web服务器(静态资源服务器),如:
    • Apache 服务器
    • Nginx
    • IIS

区别:

web服务器(Nginx)不能解析jsp、servlet等动态资源,只能处理js、css、html等静态资源

web应用服务器(Tomcat)可以jsp、servlet等动态资源,也可以处理js、css、html等静态资源。

并发: web服务器(Nginx)的并发能力远高于web应用服务器(Tomcat)。

3.nginx作为反向代理

1.什么是反向代理?

  • 代理:通过客户机的配置,实现让一台服务器代理客户机,客户的所有请求都交给代理服务 器处理。
  • 正向代理

image

比如:各种FQ软件,vpn,各种游戏加速器等等。

  • 反向代理:用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代 理服务器。

  • 我们需要提前在nginx中配置好反向代理的规则,不同的请求,交给不同的真实服务器处理

  • 当请求到达nginx,nginx会根据已经定义的规则进行请求的转发,从而实现路由功能

image

4.nginx的安装

Nginx下载地址

http://nginx.org/en/download.html

1.解压压缩文件

将下载下来的Nginx的安装包,解压到没有中文、空格的目录中即可。

image

image

  • conf:配置目录
  • contrib:第三方依赖
  • docs:文档目录
  • html:默认的静态资源目录,类似于tomcat的webapps
  • logs:日志目录
  • temp:临时目录
  • nginx.exe:启动程序。可双击运行,但不建议这么做。

2.启动Nginx

方式一:双击Nginx安装目录nginx.exe

方式二:cmd中执行指令

image

3.关闭Nginx

打开Windows的任务管理,找到nginx的进程,杀死即可

4.访问

浏览器输入地址:http://localhost/,出现以下页面即为启动成功,nginx默认端口是80

image

5.nginx作为web服务器的使用

Nginx 是一个 http 服务可以独立提供 http 服务。可以做网页静态服务器(存放静态资源 (css,js,html)服务区)。

1.编辑nginx.conf配置文件,添加如下配置

server{
    listen 80; #监听端口
    server_name www.yan8.com; #主机地址,可以是ip地址或者域名
    location / { # 请求路径对应的资源目录 / :localhost:80/
        root D:/Software/Java/nginx-1.18.0/yan8; # 资源目录,如果目录是在nginx的安装目录,可以只写目录名
        index index.html index.htm; # 默认打开资源目录中的哪个文件
    }
}

2.在nginx安装根目录下创建yan8目,并创建index.html

<!DOCTYPE html>
<html>
<head>
	<title>Welcome to yan8!</title>
</head>
<body>
	<h1>Welcome to yan8!</h1>
</body>
</html>

3.修改Windows系统的hosts文件

hosts文件的位置:C:\Windows\System32\drivers\etc

127.0.0.1 www.yan8.com

4.启动nginx

5.进行测试

image

6.nginx作为反向代理

1.将一个管理系统项目部署到Tomcat中,启动Tomcat

2.在hosts文件中添加一个配置

127.0.0.1 www.personnel.com

3.在nginx.conf文件中添加server配置

server{
        listen 80; #监听端口
        server_name www.personnel.com; #主机地址,可以是ip地址或者域名
        
        proxy_set_header X-Forwarded-Host $host; #把原Http请求的Header中的XForwarded-Host(主机地址)字段放到转发的请求中
        proxy_set_header X-Forwarded-Server $host; #把原Http请求的Header中的X-Forwarded-Server(主机名)字段放到转发的请求中
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #获取用户真实ip
        
        location / {
            proxy_pass http://127.0.0.1:8080; # 转发地址,代理的真正地址
            proxy_connect_timeout 600; # 连接超时时间
            proxy_read_timeout 600; # 读取超时时间
        }
}

4.重启nginx进行测试

7.nginx作为负载均衡使用

1.对管理系统项目进行集群部署(部署到两台Tomcat中)

修改两台Tomcat中的人事管理系统的loginForm.jsp的title分别为"创新创业型小微企业的人力资 源管理平台8080"和"创新创业型小微企业的人力资源管理平台8081"。

修改两个Tomcat的端口分别为8080和8081。(修改Tomcat安装目录下的conf目录下 server.xml文件)

启动两个Tomcat,分别访问

image

image

2.修改nginx.conf的配置文件

upstream personnel{
        server 127.0.0.1:8080 weight=4; # weight访问权重,简单理解:9次中有4次访问
        server 127.0.0.1:8081 weight=5;
        }
        
        server{
            listen 80; #监听端口
            server_name www.personnel.com; #主机地址,可以是ip地址或者域名
            proxy_set_header X-Forwarded-Host $host; #把原Http请求的Header中的XForwarded-Host(主机地址)字段放到转发的请求中
            proxy_set_header X-Forwarded-Server $host; #把原Http请求的Header中的
X-Forwarded-Server(主机名)字段放到转发的请求中
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #获取
用户真实ip
            
            location / {
                proxy_pass http://personnel; # 转发地址,代理的真正地址
                proxy_connect_timeout 600; # 连接超时时间
                proxy_read_timeout 600; # 读取超时时间
        }
}

3.重启nginx,进行测试

2.fastdfs

1.什么是分布式文件系统

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直 接连接在本地节点上,而是通过计算机网络与节点相连。

  • 传统文件系统管理的文件就存储在本机。
  • 分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论 是上传或者访问文件,都需要通过管理中心来访问

2.什么是FastDFS

FastDFS是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件存储系统。用 纯C语言开发,功能丰富:

它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载) 等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网 站、视频网站等等。

FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高 可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上 传、下载等服务。

  • 文件存储
  • 文件同步
  • 文件访问(上传、下载)
  • 存取负载均衡
  • 在线扩容

3.FastDFS的架构

image

FastDFS两个主要的角色:Tracker Server 和 Storage Server

  • Tracker Server:跟踪服务器(管理中心),主要负责调度storage节点与client通信,在访 问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽。
  • Storage Server:存储服务器,保存文件和文件的meta data(元数据),每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息
  • Group:文件组,多台Storage Server的集群。上传一个文件到同组内的一台机器上后, FastDFS会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务 器,保存的数据不同,而且相互独立,不进行通信。
  • Tracker Cluster:跟踪服务器的集群,有一组Tracker Server(跟踪服务器)组成。
  • Storage Cluster :存储集群,有多个Group组成。

4.上传和下载流程

1.上传流程

image

客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信 息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

组名:文件上传后所在的 storage 组名称,在文件上传成功后有storage 服务器返回,需要客户 端自行保存。

虚拟磁盘路径:storage 配置的虚拟路径,与磁盘选项store_path*对应。如果配置了 store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。

数据两级目录:storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。

文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储 服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

2.下载流程

image

5.单节点FastDFS安装和使用

1.安装gcc

  • yum -y install gcc
  • yum install -y unzip zip
  • yum -y install libevent

2.安装libfastcommon-master

在linux的opt目录中创建fastdfs目录,并将安装文件上传到此目录中。

image

  • unzip libfastcommon-master.zip
  • cd libfastcommon-master
  • ./make.sh
  • ./make.sh instal

3.安装fastdfs

  • tar -zxvf FastDFS_v5.08.tar.gz
  • cd FastDFS
  • ./make.sh
  • ./make.sh install

1.配置并启动tracker服务

  • cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

  • cd /opt/fastdfs

  • mkdir -p lanou/tracker

  • vim /etc/fdfs/tracker.conf 修改内容

    base_path=/opt/fastdfs/lanou/tracker

  • service fdfs_trackerd start # 启动fdfs_trackerd服务,停止用stop

  • ps -ef | grep fdfs_trackerd 检查是否启动成功

2.配置并启动storage服务

  • cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
  • cd /opt/fastdfs/lanou
  • mkdir -p storage
  • vim /etc/fdfs/storage.conf 修改内容如下
base_path=/opt/fastdfs/lanou/storage # 数据和日志文件存储根目录
store_path0=/opt/fastdfs/lanou/storage # 第一个存储目录
tracker_server=192.168.200.129:22122 # tracker服务器IP和端口
  • service fdfs_storaged start # 启动fdfs_storaged服务,停止用stop
  • ps -ef | grep fdfs
  • Linux防火墙对端口放行
firewall-cmd --permanent --add-port=22122/tcp #tracker服务器端口
firewall-cmd --permanent --add-port=23000/tcp #storage服务器端口
systemctl restart firewalld

3.使用nginx访问FastDFS

1.为什么需要用Nginx访问?

FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。

假设Tracker服务器将文件上传到了192.168.4.125,上传成功后文件ID已经返回给客户 端。此时FastDFS存储集群机制会将这个文件同步到同组存储192.168.4.126,在文件还没 有复制完成的情况下,客户端如果用这个文件ID在192.168.4.126上取文件,就会出现文件无 法访问的错误。

而fastdfs-nginx-module可以重定向文件连接到文件上传时的源服务器取文件,避免客户端 由于复制延迟导致的文件无法访问错误

2.安装fastdfs-nginx-module

  • tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
  • cd fastdfs-nginx-module/src/
  • vim config
  • : %s+/usr/local/+/usr/+g 将文件中所有的/usr/local替换为 /usr

image

3.配置nginx与FastDFS关联配置文件

  • cp /opt/fastdfs/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
  • vim /etc/fdfs/mod_fastdfs.conf
connect_timeout=10 # 客户端访问文件连接超时时长(单位:秒)
tracker_server=192.168.200.129:22122 # tracker服务IP和端口
url_have_group_name=true # 访问链接前缀加上组名
store_path0=/opt/fastdfs/test/storage # 文件存储路径
  • cd /opt/fastdfs/FastDFS/conf/
  • cp http.conf mime.types /etc/fdfs/

4.安装Nginx的插件

  • yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel 安装nginx的依赖库
  • cd /opt
  • mkdir nginx mv /opt/fastdfs/nginx-1.10.0.tar.gz /opt/nginx/
  • cd /opt/nginx
  • tar -zxvf nginx-1.10.0.tar.gz cd nginx-1.10.0 ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --addmodule=/opt/fastdfs/fastdfs-nginx-module/src
  • make && make install

5.启动nginx

  • vim /opt/nginx/conf/nginx.conf
  • 将文件中,原来的 server 80{ ...} 部分代码替换为如下代码
server {
    listen 80;
    server_name image.test.com;
    # 监听域名中带有group的,交给FastDFS模块处理
    location ~/group([0-9])/ {
    	ngx_fastdfs_module;
    }
    location / {
        root html;
        index index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    	root html;
    }
}
  • nginx # 启动nginx
  • nginx -s stop # 停止nginx(不是必须执行的)
  • nginx -s reload # 无需重启nginx,重新载入配置文件(不是必须执行的)
  • Linux防火墙对80端口放行

4.使用springboot进行图片测试

1.修改hosts文件

windows中的hosts文件中增加

192.168.200.129 image.test.com

2.创建一个springboot项目

3.引入相关依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.26.1-RELEASE</version>
</dependency>

4.编写yml配置文件

fdfs:
    so-timeout: 1501 # 超时时间
    connect-timeout: 601 # 连接超时时间
    thumb-image: # 缩略图
        width: 60
        height: 60
    tracker-list: # tracker地址:你的虚拟机服务器地址+端口(默认是22122)
    - 192.168.136.66:22122

5.编写配置类

@Configuration
@Import(FdfsClientConfig.class)
// 解决重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastClientImporter {
}

6.编写Controller进行测试

浏览器 -> controller -> fastdfs

@RestController
public class UpLoadController {
    @Autowired
    private FastFileStorageClient storageClient;
    @RequestMapping("/up")
    public String testUpload() throws FileNotFoundException {
        // 要上传的文件
        File file = new File("E:\\123.jpg");
        // 上传并保存图片,参数:1-上传的文件流 2-文件的大小 3-文件的后缀 4-可
以不管他
        StorePath storePath = this.storageClient.uploadFile(new FileInputStream(file), file.length(), "jpg", null);
        // 带分组的路径
        System.out.println(storePath.getFullPath());
        // 不带分组的路径
        System.out.println(storePath.getPath());
        return "success";
    }
}

7.测试是否上传成功

image

注意:如果使用的阿里云或者腾讯云等云服务器,这些云服务器会自动检测域名是否合法,不合 法不能使用,所以这时可以使用ip访问Linux中的nginx

[]: (http:/192.168.200.129/group1/M00/00/00/wKjlgWLgdDeAJfv6AAFqAmhf_3Y000.jpg)

posted @   加包辣条多放辣椒  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示