來自與拉鉤教育-Java就業(yè)集訓(xùn)營
課程目標(biāo):
1、場景概述
2沥曹、FastDFS的上傳與下載
3份名、項目實戰(zhàn):搭建圖片服務(wù)器
1.場景概述
- 天貓、淘寶等購物網(wǎng)站,大量的圖片和視頻,文件太多,如何儲存妓美。
- 用戶訪問量大又如何保證下載速度?分布式文件系統(tǒng)就是解決這些問題的鲤孵!
1.1 什么是文件系統(tǒng)
-
文件數(shù)據(jù)是如何存儲的
1.png
1.2 分布式文件系統(tǒng)
- 一臺電腦存儲量有限壶栋,并且并發(fā)吞吐量也有限,如何提高性能普监?
- 一噸貨物贵试,我要運送到吐魯番:
1個人運,不敢想象
50個人運凯正,太難了毙玻;
500個人運,每個人都很輕松廊散; - 這就是分布式嗎桑滩?
答:這里面有集群的概念,也有分布式的概念允睹,二者不要混淆运准,面試常問的經(jīng)典題目
分布式:不同的業(yè)務(wù)模塊部署在不同的服務(wù)器上或者同一個業(yè)務(wù)模塊分拆多個子業(yè)務(wù),部署不同的服務(wù)器上缭受。解決高并發(fā)的問題胁澳;
集群:同一個業(yè)務(wù)部署在多臺服務(wù)器上,提高系統(tǒng)的高可用 - 例如:
小飯館原來只有一個廚師米者,切菜洗菜備料一手抓韭畸∮钪牵客人越來越多,一個廚師忙不過來胰丁,只能再請一個廚師随橘,兩個廚師都能炒菜,也就是兩個廚師的作用是一樣的隘马,這樣太防,兩個廚師的關(guān)系就是“集群”;
為了讓廚師專心炒菜酸员,把菜炒到極致蜒车,又請了配菜師負(fù)責(zé)切菜,備料等工作幔嗦。廚師和備菜師的關(guān)系是“分布式”酿愧;
一個備菜師忙不過來,要提供兩份食材給兩個廚師邀泉,又請了一個備菜師嬉挡,兩個備菜師的關(guān)系又是“集群”。
1.3 主流的分布式文件系統(tǒng)
1.3.1 HDFS
- (Hadoop Distributed File System)Hadoop 分布式文件系統(tǒng)汇恤;
- 高容錯的系統(tǒng)庞钢,適合部署到廉價的機器上;
- 能提供高吞吐量的數(shù)據(jù)訪問因谎,非常適合大規(guī)模數(shù)據(jù)應(yīng)用基括;
- HDFS采用主從結(jié)構(gòu),一個HDFS是由一個name節(jié)點和N個data節(jié)點組成财岔;
- name節(jié)點儲存元數(shù)據(jù)风皿,一個文件分割成N份存儲在不同的data節(jié)點上。
1.3.2 GFS
- Google File System
- 可擴展的分布式文件系統(tǒng)匠璧,用于大型的桐款,分布式的,對大量數(shù)據(jù)進行訪問的應(yīng)用夷恍;
- 運行于廉價的普通硬件上魔眨,可以提供容錯功能;
- 它可以給大量的用戶提供總體性能較高的服務(wù)裁厅;
- GFS采用主從結(jié)構(gòu)冰沙,一個GFS集群由一個master和大量的chunkserver(分塊服務(wù)器)組成;
- 一個文件被分割若干塊执虹,分散儲存到多個分塊server中
1.3.3.FastDFS
- 由淘寶資深架構(gòu)師余慶編寫并開源拓挥;
- 專為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份袋励、負(fù)載均衡侥啤、線性擴容等機制当叭,并注重高可用、高性能等指標(biāo)盖灸,使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳蚁鳖、下載等服務(wù);
- HDFS赁炎,GFS等都是通用的文件系統(tǒng)醉箕,他們的優(yōu)點是開發(fā)體驗好,但是系統(tǒng)的復(fù)雜度較高徙垫,性能也一般讥裤;
- 相比之下,專用的分布式文件系統(tǒng)體驗差姻报,但是復(fù)雜度低己英,性能也高,尤其fastDFS特別適合圖片吴旋,小視頻等小文件损肛,因為fastDFS對文件是不分割的,所以沒有文件合并的開銷荣瑟;網(wǎng)絡(luò)通信用socket治拿,速度快。
1.4 工作原理
fastDFS包含Tracker Server和Storage Server笆焰;
客戶端請求Tracker Server進行文件的上傳與下載忍啤;
-
Tracker Server調(diào)度Storage Server最終完成上傳與下載。
4.png Tracker (譯:追蹤者)
1.作用是負(fù)載均衡和調(diào)度仙辟,它管理著存儲服務(wù)(Storage Server),可以理解為:“大管家鳄梅,追蹤者叠国,調(diào)度員”;
2.Tracker Server可以集群戴尸,實現(xiàn)高可用粟焊,策略為“輪詢”。Storage (譯:倉庫; 貯存器)
1.作用是文件存儲孙蒙,客戶端上傳的文件最終存儲到storage服務(wù)器上项棠;
2.storage集群采用分組的方式,同組內(nèi)的每臺服務(wù)器是平等關(guān)系挎峦,數(shù)據(jù)同步香追,目的是實現(xiàn)數(shù)據(jù)備份,從而高可用坦胶,而不同組的服務(wù)器之間是不通信的透典;
3.同組內(nèi)的每臺服務(wù)器的存儲量不一致的情況下晴楔,會選取容量最小的那個,所以同組內(nèi)的服務(wù)器之間軟硬件最好保持一致峭咒。
4.Storage Server會連接集群中的所有Tracker Server税弃,定時向他們匯報自己的狀態(tài),例如:剩余空間凑队,文件同步情況则果,文件上傳下載次數(shù)等信息。
1.5 上傳/下載 原理
- 客戶端上傳文件后漩氨,storage會將文件id返回給客戶端
- group1/M00/02/11/aJxAeF21O5wAAAAAAAAGaEIOA12345.sh
組名(group1):文件上傳后西壮,在storage組的名稱,文件上傳成功后才菠,由storage返回茸时,需要客戶端自行保存。
虛擬磁盤路徑(M00):
storage配置的虛擬路徑赋访,在磁盤選項storage_path對應(yīng)可都。
storage_path0對應(yīng)M00,
storage_path1對應(yīng)M01蚓耽,
數(shù)據(jù)兩級目錄(02/11):
storage在虛擬磁盤下自行創(chuàng)建的目錄渠牲。
文件名(aJxAeF21O5wAAAAAAAAGaEIOA12345.sh):
與上傳時不同,是用storage根據(jù)特定信息生成的步悠,里面包含:storage服務(wù)器的ip签杈,創(chuàng)建時
間戳,大小鼎兽,后綴名等信息
2. FastDFS的上傳與下載
2.1 安裝
2.1.1 安裝gcc(編譯時需要)
yum install -y gcc gcc-c++
2.1.2 安裝libevent(運行時需求)
yum -y install libevent
2.1.3 安裝 libfastcommon
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS運行所需要的一些基礎(chǔ)庫谚咬。
- 上傳 libfastcommon-master.zip 到 /opt
安裝解壓zip包的命令: yum install -y unzip
解壓包: unzip libfastcommon.zip
進入目錄: cd libfastcommon-master
- 編譯
./make.sh
- 如果:make.sh的權(quán)限不夠鹦付,則需要授權(quán)(可執(zhí)行的權(quán)利)
chmod 777 make.sh
- 安裝
./make.sh install
- libfastcommon安裝好后會在/usr/lib64 目錄下生成 libfastcommon.so 庫文件
- 拷貝庫文件
cd /usr/lib64
cp libfastcommon.so /usr/lib
2.1.4 安裝Tracker
下載 FastDFS_v5.05.tar.gz,并上傳到 /opt
tar -zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh
./make.sh install
安裝成功將安裝目錄下的conf下的文件拷貝到/etc/fdfs/下
cp /opt/FastDFS/conf/* /etc/fdfs/
2.2 配置
- Tracker配置
vim /etc/fdfs/tracker.conf
#端口號
port=22122
#基礎(chǔ)目錄(Tracker運行時會向此目錄存儲storage的管理數(shù)據(jù))(基礎(chǔ)目錄不存在的話择卦,需要自行創(chuàng)建
mkdir /home/fastdfs)
base_path=/home/fastdfs
- Storage配置
vim /etc/fdfs/storage.conf
#配置組名
group_name=group1
#端口
port=23000
#向tracker心跳間隔(秒)
heart_beat_interval=30
#storage基礎(chǔ)目錄
#目錄不存在敲长,需要自行創(chuàng)建
base_path=/home/fastdfs
#store存放文件的位置(store_path)
#可以理解一個磁盤一個path,多個磁盤秉继,多個store_path
#fdfs_storage目錄不存在祈噪,需要自行創(chuàng)建
#mkdir /home/fastdfs/fdfs_storage
store_path0=/home/fastdfs/fdfs_storage
#如果有多個掛載磁盤則定義多個store_path,如下
#store_path1=..... (M01)
#store_path2=..... (M02)
#配置tracker服務(wù)器:IP
tracker_server=10.1.220.247:22122
#如果有多個則配置多個tracker
#tracker_server=10.1.220.x:22122
2.3 啟動服務(wù)
- 啟動tracker
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
- 啟動storage
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
- 查看所有運行的端口:
netstat -ntlp
2.4 搭建 Java工程
2.4.1 pom.xml
<!--fastdfs的java客戶端-->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
2.4.2 創(chuàng)建配置文件
在resources下創(chuàng)建config目錄尚辑,在config目錄下創(chuàng)建 fastdfs-client.properties辑鲤,內(nèi)容如下:
##fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = 10.1.220.247:22122
2.4.3 文件上傳
public class TestUpload {
public static void main(String[] args) {
try {
// 加載配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
// 創(chuàng)建tracker客戶端
TrackerClient trackerClient = new TrackerClient();
// 通過tracker客戶端獲取tracker的連接服務(wù)并返回
TrackerServer trackerServer = trackerClient.getConnection();
// 聲明storage服務(wù)
StorageServer storageServer = null;
// 定義storage客戶端
StorageClient1 client = new StorageClient1(trackerServer,
storageServer);
// 定義文件元信息
NameValuePair[] list = new NameValuePair[1];
list[0] = new NameValuePair("fileName","1.jpg");
String fileID = client.upload_file1("F:\\img\\1.jpg", "jpg", list);
System.out.println("fileID = " + fileID);
// group1/M00/00/00/CgHc918f8l6AFYp0AAWICfQnHuk889.jpg
/*
group1:一臺服務(wù)器,就是一個組
M00: store_path0 ----> /home/fastdfs/fdfs_storage/data
00/00:兩級數(shù)據(jù)目錄
*/
trackerServer.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
2.4.4 文件查詢
package test;
import org.csource.fastdfs.*;
/**
* @BelongsProject: lagou-fastdfs
* @Author: GuoAn.Sun
* @CreateTime: 2020-07-28 17:46
* @Description: 文件查詢
*/
public class TestQuery {
public static void main(String[] args) throws Exception {
// 加載配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
// 創(chuàng)建tracker客戶端
TrackerClient trackerClient = new TrackerClient();
// 通過tracker客戶端獲取tracker的連接服務(wù)并返回
TrackerServer trackerServer = trackerClient.getConnection();
// 聲明storage服務(wù)
StorageServer storageServer = null;
// 定義storage客戶端
StorageClient1 client = new StorageClient1(trackerServer,
storageServer);
FileInfo fileInfo =
client.query_file_info1("group1/M00/00/00/CgHc918f8l6AFYp0AAWICfQnHuk889.jpg");
if(fileInfo!=null)
System.out.println("fileInfo = " + fileInfo);
else
System.out.println("查無此文件腌巾!");
trackerServer.close();
}
}
2.4.5 文件下載
public class TestDownload {
public static void main(String[] args) throws Exception{
// 加載配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
// 創(chuàng)建tracker客戶端
TrackerClient trackerClient = new TrackerClient();
// 通過tracker客戶端獲取tracker的連接服務(wù)并返回
TrackerServer trackerServer = trackerClient.getConnection();
// 聲明storage服務(wù)
StorageServer storageServer = null;
// 定義storage客戶端
StorageClient1 client = new StorageClient1(trackerServer,
storageServer);
byte[] bytes =
client.download_file1("group1/M00/00/00/CgHc918f8l6AFYp0AAWICfQnHuk889.jpg");
// 通過io將字節(jié)數(shù)組遂填,轉(zhuǎn)換成一個文件
FileOutputStream fileOutputStream = new FileOutputStream(new
File("F:/xxxxxx.jpg"));
fileOutputStream.write(bytes);
fileOutputStream.close();
trackerServer.close();
System.out.println("下載完畢铲觉!");
}
}
3. 項目實戰(zhàn)
- 掌握fastDFS在真實項目中的使用方法;
- 掌握fastDFS實現(xiàn)圖片服務(wù)器吓坚;
3.1 搭建圖片服務(wù)器
3.1.1 Nginx模塊安裝 (Storage)
- 上傳 fastdfs-nginx-module_v1.16.tar.gz 到 /opt
- 解壓nginx模塊
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
- 修改 config 文件撵幽,將文件中的 /usr/local/ 路徑改為 /usr/
cd /opt/fastdfs-nginx-module/src
vim config
- 將 fastdfs-nginx-module/src下的 mod_fastdfs.conf 拷貝至 /etc/fdfs 下
cp mod_fastdfs.conf /etc/fdfs/
- 修改 /etc/fdfs/mod_fastdfs.conf
vim /etc/fdfs/mod_fastdfs.conf
base_path=/home/fastdfs
tracker_server=10.1.220.247:22122
#(n個tracker配置n行)
#tracker_server=10.1.220.x:22122
#url中包含group名稱
url_have_group_name=true
#指定文件存儲路徑(上面配置的store路徑)
store_path0=/home/fastdfs/fdfs_storage
- 將 libfdfsclient.so 拷貝至 /usr/lib 下
cp /usr/lib64/libfdfsclient.so /usr/lib/
- 創(chuàng)建nginx/client目錄
mkdir -p /var/temp/nginx/client
3.1.2 Nginx安裝 (Tracker)
- 將 nginx-1.14.0.tar.gz上傳到/opt(安裝過nginx,此步省略)
- 解壓:tar -zxvf nginx-1.14.0.tar.gz(安裝過nginx礁击,此步省略)
- 安裝依賴庫(安裝過nginx盐杂,此步省略)
yum install pcre
yum install pcre-devel
yum install zlib
yum install zlib-devel
yum install openssl
yum install openssl-devel
- 進入nginx解壓的目錄下 cd /opt/nginx-1.14.0
- 安裝
/configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--add-module=/opt/fastdfs-nginx-module/src
注意:上邊將臨時文件目錄指定為 /var/temp/nginx,需要在 /var 下創(chuàng)建 temp 及 nginx 目錄:mkdir /var/temp/nginx (模塊對應(yīng)的文件要提前創(chuàng)建否則make會報錯)
- 編譯:make
- 安裝:make install
- 拷貝配置文件
cd /opt/FastDFS/conf
cp http.conf mime.types /etc/fdfs/
是否覆蓋:yes
- 修改nginx配置文件
cd /usr/local/nginx/conf/
vim nginx.conf
server {
listen 80;
server_name 10.1.220.247;
#charset koi8-r;
#access_log logs/host.access.log main;
location /group1/M00 {
root /home/fastdfs/fdfs_storage/data;
ngx_fastdfs_module;
}
- 關(guān)閉nginx哆窿,并啟動nginx
pkill -9 nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
- 訪問nginx并查看圖片
http://10.1.220.247
http://10.1.220.247/group1/M00/00/00/CgHc918f8l6AFYp0AAWICfQnHuk889.jpg
3.2 創(chuàng)建前端頁面
<%--上傳文件链烈,文件與文字相比較起來,屬于內(nèi)容較大挚躯,必須使用post方式提交--%>
<%--上傳文件强衡,和普通文件有區(qū)別,action接收參數(shù)也會區(qū)別對待码荔,所以聲明帶文件提交的表單為“多部
件表單”--%>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="fname">
<br>
<button>提交</button>
</form>
3.3 搭建web服務(wù)
3.3.1 pom.xml
<packaging>war</packaging>
<dependencies>
<!-- 因為有jsp頁面漩勤,所以引用servlet依賴-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
<version>2.5</version>
</dependency>
<!-- 頁面提交過來的請求,使用springmvc來處理-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<!-- java連接fastDFS的客戶端工具-->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
<!-- 圖片上傳到FastDFS需要用的到IO工具-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 圖片保存到web服務(wù)器需要用到的IO工具-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!--用來轉(zhuǎn)換java對象和json字符串缩搅,注意越败,2.7以上版本必須搭配spring5.0以上-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8001</port>
<path>/</path>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3.3.2 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet?class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.3.3 spring-mvc.xml
<!--掃描注解的包-->
<context:component-scan base-package="controller"/>
<!--掃描控制器中的注解:@Response-->
<mvc:annotation-driven/>
<!--上傳文件的解析器(規(guī)定上傳文件的大小限制)-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上傳文件最大限制:2GB-->
<property name="maxUploadSize" value="2048000000"/>
</bean>
3.3.4 文件實體類
public class FileSystem implements Serializable {
private String fileId;
private String filePath;
private String fileName;
}
3.3.5 控制層
@Controller
public class FileAction {
/**
* @param request 多部件表單的請求對象
* @return 上傳文件對象的json對象
* @throws Exception
*
* 上傳文件的流程:
* 1、先把文件保存到web服務(wù)器上
* 2硼瓣、再從web服務(wù)器上將文件 上傳 到 FastDFS上
*/
@RequestMapping("upload")
//MultipartHttpServletRequest:是httpservletRequest的強化版本究飞,不僅可以裝文本信
息,還可以裝圖片文件信息
public @ResponseBody FileSystem upload(MultipartHttpServletRequest request)
throws Exception {
FileSystem fileSystem = new FileSystem();
/* 1堂鲤、把文件保存到web服務(wù)器*/
// 從頁面請求中亿傅,獲取上傳的文件對象
MultipartFile file = request.getFile("fname");
// 從文件對象中獲取 文件的原始名稱
String oldFileName = file.getOriginalFilename();
// 通過字符串截取的方式,從文件原始名中獲取文件的后綴 1.jpg
String hou = oldFileName.substring(oldFileName.lastIndexOf(".") + 1);
// 為了避免文件因為同名而覆蓋瘟栖,生成全新的文件名
String newFileName = UUID.randomUUID().toString() + "." + hou;
// 創(chuàng)建web服務(wù)器保存文件的目錄(預(yù)先創(chuàng)建好D:/upload目錄袱蜡,否則系統(tǒng)找不到路徑,會拋異
常)
File toSaveFile = new File("D:/upload/" + newFileName);
// 將路徑轉(zhuǎn)換成文件
file.transferTo(toSaveFile);
// 獲取服務(wù)器的絕對路徑
String newFilePath = toSaveFile.getAbsolutePath();
/* 2慢宗、把文件從web服務(wù)器上傳到FastDFS*/
ClientGlobal.initByProperties("config/fastdfs-client.properties");
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer,
storageServer);
NameValuePair[] list = new NameValuePair[1];
list[0] = new NameValuePair("fileName",oldFileName);
String fileId = client.upload_file1(newFilePath, hou, list);
trackerServer.close();
// 封裝fileSystem數(shù)據(jù)對象
fileSystem.setFileId(fileId);
fileSystem.setFileName(oldFileName);
fileSystem.setFilePath(fileId); //已經(jīng)上傳到FastDFS上,通過fileId來訪問圖
片奔穿,所以fileId即為文件路徑
return fileSystem;
}
}
3.3.6 添加fastDFS的配置文件
在resources下創(chuàng)建config目錄镜沽,在config目錄下創(chuàng)建 fastdfs-client.properties
參考:2.4.2
3.3.7 啟動fastDFS服務(wù),測試開始
[root@localhost /]# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
[root@localhost /]# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
[root@localhost /]# /usr/local/nginx/sbin/nginx -c
/usr/local/nginx/conf/nginx.conf
[root@localhost /]# netstat -ntlp
[root@localhost /]# systemctl stop firewalld.service
[root@localhost /]# cd /home/fastdfs/fdfs_storage/data/
[root@localhost /]# ls