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