一、搭建nginx
1.1 安裝gcc、pcre、zlib、openssl環境
1.1.1 gcc
- yum install gcc-c++
1.1.2 pcre
- yum install -y pcre pcre-devel
1.1.3 zlib
- yum install -y zlib zlib-devel
1.1.4 openssl
- yum install -y openssl openssl-devel
1.2 安裝nginx
1.2.1 上傳nginx-1.8.0.tar.gz到指定目錄,並解壓
- [root@localhost ~]# cd /usr/local/env/nginx/
- [root@localhost nginx]# tar -zxvf nginx-1.8.0.tar.gz -C /usr/local/env/nginx/
1.2.2 configure
- [root@localhost nginx]# cd nginx-1.8.0
- [root@localhost nginx-1.8.0]# ./configure
1.2.3 編譯、安裝
- [root@localhost nginx-1.8.0]# make
此時會生成makefile文件,再install
- [root@localhost nginx-1.8.0]# make install
此時,會在/usr/local/路徑下生成nginx相關文件夾(注:此路徑可以修改,可通過configure配置文件來修改生成位置)
1.2.4 啓動並訪問nginx主頁
- [root@localhost nginx-1.8.0]# cd /usr/local/nginx/sbin/
- [root@localhost sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf
注: 可以通過-c來指定nginx啓動的配置文件nginx.conf
默認的nginx.conf會通過配置,將訪問路徑/映射到自己的html文件夾下的index.html主頁上
訪問主頁,如果看到歡迎頁,說明安裝nginx成功.
1.2.5 停止nginx
方式1,快速停止:此方式相當於先查出nginx進程id再使用kill命令強制殺掉進程。
- [root@localhost sbin]# pwd
- /usr/local/nginx/sbin
- [root@localhost sbin]# ./nginx -s stop
- [root@localhost sbin]#
方式2,完整停止(建議使用):此方式停止步驟是待nginx進程處理任務完畢進行停止。
- [root@localhost sbin]# pwd
- /usr/local/nginx/sbin
- [root@localhost sbin]# ./nginx -s quit
- [root@localhost sbin]#
1.2.6 重啓nginx
- [root@localhost sbin]# ./nginx -s reload
注意:此步驟有時會報pid找不到的錯誤:
可通過如下方式解決:
- [root@localhost sbin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
此時,即可啓動成功。
二、 搭建vsftpd
2.1 使用yum安裝vsftpd
- [root@localhost /]# yum -y install vsftpd
此時,會默認安裝在/etc/vsftpd路徑下
2.2 添加ftp用戶ftpuser,並設置密碼
- [root@localhost /]# useradd ftpuser
- [root@localhost /]# passwd ftpuser
- Changing password for user ftpuser.
- New password:
- BAD PASSWORD: it is too simplistic/systematic
- BAD PASSWORD: is too simple
- Retype new password:
- passwd: all authentication tokens updated successfully.
- [root@localhost /]#
此時在/home/路徑下會生成一個ftpuser文件夾
2.3 開啓21號端口,防火牆默認是不開啓的
修改/etc/sysconfig/iptables文件,將22那條記錄複製,改爲21即可
重啓防火牆
- [root@localhost /]# service iptables restart
2.4 設置vsftpd開機啓動
- [root@localhost /]# chkconfig vsftpd on
2.5 修改vsftp配置文件
默認vsftp的配置文件路徑爲: /etc/vsftpd/vsftpd.conf
2.5.1 關閉匿名訪問
將anonymous_enable的YES改爲NO
2.5.2 設置vsftp的根路徑
在/home/ftpuser/路徑下創建images文件夾作爲vsftp文件根目錄,並設置最大權限
- [root@localhost /]# mkdir /home/ftpuser/images
- [root@localhost /]# ll /home/ftpuser/
- total 4
- drwxr-xr-x. 2 root root 4096 Mar 31 00:18 images
- [root@localhost /]# chmod -R 777 /home/ftpuser/images
- [root@localhost /]# ll /home/ftpuser/
- total 4
- drwxrwxrwx. 2 root root 4096 Mar 31 00:18 images
- [root@localhost /]#
在配置文件中添加根路徑
注:local爲遠程用戶訪問的根路徑,anon爲匿名用戶訪問的根路徑 注:等號倆邊不要有空格
- local_root=/home/ftpuser/images/
- anon_root=/home/ftpuser/images/
2.5.3 設置是否限制遠程用戶訪問路徑
限制遠程用戶只能訪問ftp根路徑及其子路徑,不能向上訪問。默認爲可以訪問,爲NO,如果需要限制,改爲YES即可。
- chroot_local_user=NO
注: 此處如果設置爲YES,則使用FtpClient鏈接時會有問題,改爲NO,就可以了,原因待解決。
2.5.4 重啓vsftp
- [root@localhost /]# service vsftpd restart
2.6 修改selinux
使用遠程終端連接的時候,無法獲取目錄列表,需要使用如下倆個命令修改倆個狀態:
- [root@localhost ~]# setsebool -P allow_ftpd_full_access on
- [root@localhost ~]# setsebool -P ftp_home_dir on
注: 這倆個命令都會執行倆分鐘左右,請耐心等待
2.7 訪問ftp服務器
先關閉服務器防火牆,否則用終端工具鏈接不上ftp服務器
- [root@localhost /]# service iptables stop
先通過遠程終端工具(推薦使用MobaXterm)鏈接ftp服務器:
登陸之後上傳一張圖片到主目錄下,然後使用ftp協議訪問:
ftp搭建成功。
三、 配置nginx.conf的ftp服務器ip和用戶
3.1 修改用戶爲root
3.2 添加server指向自己的服務器IP和ftp根路徑
- server{
- listen 80;
- server_name ftp所在服務器的ip;
- location / {
- root /home/ftpuser;
- }
- }
注: 此時在訪問服務器IP/路徑的時候會自動將/映射爲/home/ftpuser/路徑
3.3 重啓nginx
- [root@localhost sbin]# cd /usr/local/nginx/sbin/
- [root@localhost sbin]# ./nginx -s reload
3.4 使用http協議訪問ftp服務器圖片
四. FtpUtil
4.1 pom.xml
4.2 測試是否可以成功上傳
- public class FTPTest {
- @Test
- public void testFtpClient() throws Exception {
- // 創建一個FtpClent對象
- FTPClient ftpClient = new FTPClient();
- // 創建ftp連接,安裝ftp服務的虛擬機ip,默認端口爲21
- ftpClient.connect("xxx.xxx.xxx.xxx",21);
- // 使用用戶名和密碼登錄ftp服務器
- ftpClient.login("xxxxxx", "xxxxxx");
- // 讀取本地要上傳文件,以流的形式創建
- FileInputStream inputStream = new FileInputStream(new File("F:\\temp\\1.png"));
- // 設置上傳的路徑
- ftpClient.changeWorkingDirectory("/home/ftpuser/images");
- // 修改上傳文件的格式
- ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
- // 上傳文件
- // 第一個參數爲: 服務器端的文件名
- // 第二個參數爲: 上傳文件用的輸入流
- ftpClient.storeFile("hello.png", inputStream);
- // 關閉連接
- ftpClient.logout();
- }
- }
注: 有時候會提示soket失敗,可通過如下方式解決:
eclipse->windows->preferences->java->install JREs --> edit --> Default VM arguments
添加 -Djava.net.preferIPv4Stack=true 即可
4.3 FtpUtil
- package com.taota.common.utils;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import org.apache.commons.net.ftp.FTP;
- import org.apache.commons.net.ftp.FTPClient;
- import org.apache.commons.net.ftp.FTPFile;
- import org.apache.commons.net.ftp.FTPReply;
- /**
- * ftp上傳下載工具類
- * <p>Title: FtpUtil</p>
- * <p>Description: </p>
- * @version 1.0
- */
- public class FtpUtil {
- /**
- * Description: 向FTP服務器上傳文件
- * @param host FTP服務器hostname
- * @param port FTP服務器端口
- * @param username FTP登錄賬號
- * @param password FTP登錄密碼
- * @param basePath FTP服務器基礎目錄
- * @param filePath FTP服務器文件存放路徑。例如分日期存放:/2015/01/01。文件的路徑爲basePath+filePath
- * @param filename 上傳到FTP服務器上的文件名
- * @param input 輸入流
- * @return 成功返回true,否則返回false
- */
- public static boolean uploadFile(String host, int port, String username, String password, String basePath,
- String filePath, String filename, InputStream input) {
- boolean result = false;
- FTPClient ftp = new FTPClient();
- try {
- int reply;
- ftp.connect(host, port);// 連接FTP服務器
- // 如果採用默認端口,可以使用ftp.connect(host)的方式直接連接FTP服務器
- ftp.login(username, password);// 登錄
- reply = ftp.getReplyCode();
- if (!FTPReply.isPositiveCompletion(reply)) {
- ftp.disconnect();
- return result;
- }
- //切換到上傳目錄
- if (!ftp.changeWorkingDirectory(basePath+filePath)) {
- //如果目錄不存在創建目錄
- String[] dirs = filePath.split("/");
- String tempPath = basePath;
- for (String dir : dirs) {
- if (null == dir || "".equals(dir)) continue;
- tempPath += "/" + dir;
- if (!ftp.changeWorkingDirectory(tempPath)) {
- if (!ftp.makeDirectory(tempPath)) {
- return result;
- } else {
- ftp.changeWorkingDirectory(tempPath);
- }
- }
- }
- }
- //設置上傳文件的類型爲二進制類型
- ftp.setFileType(FTP.BINARY_FILE_TYPE);
- //上傳文件
- if (!ftp.storeFile(filename, input)) {
- return result;
- }
- input.close();
- ftp.logout();
- result = true;
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (ftp.isConnected()) {
- try {
- ftp.disconnect();
- } catch (IOException ioe) {
- }
- }
- }
- return result;
- }
- /**
- * Description: 從FTP服務器下載文件
- * @param host FTP服務器hostname
- * @param port FTP服務器端口
- * @param username FTP登錄賬號
- * @param password FTP登錄密碼
- * @param remotePath FTP服務器上的相對路徑
- * @param fileName 要下載的文件名
- * @param localPath 下載後保存到本地的路徑
- * @return
- */
- public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
- String fileName, String localPath) {
- boolean result = false;
- FTPClient ftp = new FTPClient();
- try {
- int reply;
- ftp.connect(host, port);
- // 如果採用默認端口,可以使用ftp.connect(host)的方式直接連接FTP服務器
- ftp.login(username, password);// 登錄
- reply = ftp.getReplyCode();
- if (!FTPReply.isPositiveCompletion(reply)) {
- ftp.disconnect();
- return result;
- }
- ftp.changeWorkingDirectory(remotePath);// 轉移到FTP服務器目錄
- FTPFile[] fs = ftp.listFiles();
- for (FTPFile ff : fs) {
- if (ff.getName().equals(fileName)) {
- File localFile = new File(localPath + "/" + ff.getName());
- OutputStream is = new FileOutputStream(localFile);
- ftp.retrieveFile(ff.getName(), is);
- is.close();
- }
- }
- ftp.logout();
- result = true;
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (ftp.isConnected()) {
- try {
- ftp.disconnect();
- } catch (IOException ioe) {
- }
- }
- }
- return result;
- }
- // 工具類的使用測試
- public static void main(String[] args) {
- try {
- FileInputStream in=new FileInputStream(new File("F:\\temp\\1.png"));
- boolean flag = uploadFile("xxx.xxx.xxx.xxx", 21, "xxx", "xxx", "/home/ftpuser/images","/2016/09/21", "hello.png", in);
- System.out.println(flag);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
- }