1. 程式人生 > >nginx和vsftpd搭建圖片伺服器。

nginx和vsftpd搭建圖片伺服器。

前面已經安裝了vsftpd服務:Vsftpd的安裝和配置。現在再安裝一個nginx伺服器,配合起來就能夠完成一個簡易的圖片伺服器。nginx伺服器之前也研究過,但是沒有做什麼筆記也都全忘了,事實證明不能太相信自己的記憶,好記性不如爛筆頭。

nginx的安裝。

本人使用的ubuntu系統,安裝nginx比較簡單,但是nginx需要依賴幾個額外的庫,首先因為nginx編譯2環境需要依賴gcc環境,所以需要首先安裝gcc。

安裝gcc:

sudo apt-get  build-dep  gcc  

PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 相容的正則表示式庫。nginx的http模組使用pcre來解析正則表示式,所以需要在linux上安裝pcre庫,pcre-devel是使用pcre開發的一個二次開發庫。nginx也需要此庫。

安裝pcre:

sudo apt-get install libpcre3 libpcre3-dev

zlib庫提供了很多種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip,所以需要在linux上安裝zlib庫。

安裝zlib:

sudo apt-get install zlib1g-dev

OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的金鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程式供測試或其它目的使用。nginx不僅支援http協議,還支援https(即在ssl協議上傳輸http),所以需要在linux安裝openssl庫。

安裝openssl:

sudo apt-get install openssl libssl-dev

同時這幾個庫都可以將其下載下來,然後手動編譯安裝,除了gcc之外的庫下載地址如下:

安裝完上面的幾個庫之後就可以安裝nginx了,首先需要將nginx的原始碼包下載下來,下載地址為:

下載完成之後將其解壓,解壓完成進入目錄,可以直接執行./configure進行編譯,也可以在編譯的時候指定一些引數,其他的引數可以參考:linux ./configure 的引數詳解。預設的安裝目錄為/usr/local/nginx。

如果上述的幾個庫沒有安裝好的話,在編譯的過程中可能會提示沒有找到這個依賴庫。

編譯完成之後就可以使用make&make install進行安裝。

然後進入nginx下的sbin目錄,執行./nginx即可啟動,預設使用80埠,在瀏覽器中輸入ip地址,當出現如下介面,說明安裝成功。

這裡寫圖片描述

修改nginx配置。

當成功安裝nginx之後,所看到的介面時在nginx目錄下的html中,nginx相關的配置檔案在conf下,主要時修改nginx.conf這個檔案。

假如想將上傳的圖片放入/opt/images這個目錄下,需要在nginx.conf中在配置一個location:

這裡寫圖片描述

新增這個配置之後,當有url為/images/的時候就會前去/opt這個目錄下查詢,這裡需要注意的是root對應的目錄不要寫錯了,如果寫成/opt/iamges,那麼當url為/iamges/時就會查詢/opt/iamges/images/這個目錄,顯然是不正確的;所以正確的就是/opt/,與url中的images組合起來就是/opt/images/,這才是正確的。

上傳一張圖片到/opt/iamges/目錄下,取名為1.jpg。當嘗試在訪問該圖片的時候可能會出現403錯誤:

這裡寫圖片描述

這一般就是訪問資源的許可權問題了,由於本人使用的是root使用者,可以在nginx.conf中將第一行的註釋去掉,然後修改為如下:

這裡寫圖片描述

修改完配置之後,重新載入配置檔案:

./nginx -s reload

此時再次訪問應該就可以了:

這裡寫圖片描述

通過java程式碼訪問伺服器。

如果搭建完了nginx和vsftpd,就可以通過程式碼來上傳和下載圖片了。

在apache.commons.net下提供了訪問ftp伺服器的一些物件,或者在網上有一個封裝類FtpUtil,使用這個更為方便。

FtpUtil.java :封裝ftp服務進行上傳下載。

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;


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 下載後儲存到本地的路徑
     * @param localName 本地檔名
     * @return 
     */  
    public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
            String fileName, String localPath, String localName) {
        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)) {
                    String name = localName.equals("") ? ff.getName() : localName;
                    File localFile = new File(localPath + "/" + name);

                    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;
    }
}

FTPTest.java 測試ftp服務。

import com.taotao.common.utils.FtpUtil;
import org.apache.commons.net.ftp.FTPClient;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Ftp伺服器測試
 * @Author Leafage
 * @Date 2018/2/23 22:49
 **/
public class FTPTest {
    @Test
    public void testFtpClient() throws IOException {
        // 建立一個FtpClient物件
        FTPClient ftpClient = new FTPClient();
        // 建立ftp連線
        ftpClient.connect("192.168.136.128", 21);
        // 登陸ftp伺服器,使用使用者名稱和密碼
        ftpClient.login("root","123456");
        // 上傳檔案
        // 讀取本地檔案
        FileInputStream fileInputStream = new FileInputStream("G:\\file\\test_ftpclient.jpg");
        // 設定上傳路徑
        ftpClient.changeWorkingDirectory("/opt/images");
        // 修改上傳檔案的格式,將其修改為二進位制,預設使用文字格式
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        // 引數:服務端名稱和檔案流
        ftpClient.storeFile("ftpclient.jpg", fileInputStream);
        // 關閉連線
        ftpClient.logout();
    }

    @Test
    public void testFtpUtils() throws FileNotFoundException {
        FileInputStream fileInputStream = new FileInputStream("G:\\file\\test_ftputils.jpg");
        FtpUtil.uploadFile("192.168.136.128", 21, "root", "leafage", "/opt/images", "", "testutils.jpg", fileInputStream);
    }

    @Test
    public void testFtpUtilsDowonload() {
        FtpUtil.downloadFile("192.168.136.128", 21, "root", "leafage", "/opt/images","1.jpg", "G:\\file\\","dowonload.jpg");
    }

}