1.安装nginx
nginx-1.13.9 |
下载地址:http://nginx.org/download/nginx-1.13.9.tar.gz
[root@localhost ~]# wget http://nginx.org/download/nginx-1.13.9.tar.gz
解压
[root@localhost ~]# tar -zxvf nginx-1.13.9.tar.gz
进入目录
[root@localhost ~]# cd nginx-1.13.9
编译
[root@localhost nginx-1.13.9]# ./configure
注意:这时候报错了
checking for OS
+ Linux 3.10.0-693.el7.x86_64 x86_64
checking for C compiler ... not found
./configure: error: C compiler cc is not found
这时候我们就要百度一下了,百度得知我们少一个gcc编译器 可以这么去安装 yum -y install gcc-c++
[root@localhost nginx-1.13.9]# yum -y install gcc-c++
一大堆的提示,也看不懂,最后就安装好了
再次编译
./configure
提示错误,我们需要一些安装库
[root@localhost nginx-1.13.9]# yum install -y pcre pcre-devel
[root@localhost nginx-1.13.9]# yum install -y zlib zlib-devel
[root@localhost nginx-1.13.9]# yum install -y openssl openssl-devel
再次编译
./configure
安装
[root@localhost nginx-1.13.9]# make && make install
设置开机自启动
[root@localhost nginx-1.13.9]# vi /etc/rc.local
添加一句
/usr/local/nginx/sbin/nginx
[root@localhost nginx-1.13.9]# chmod 755 /etc/rc.local
进入启目录
[root@localhost nginx-1.13.9]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx
启动
运行192.168.88.12,看看效果
看到这个图表示成功了.
修改配置支持ftp
user root;
server { listen 80; server_name 192.168.88.12;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~* \.(mp4)$ { expires 30d; valid_referers 127.0.0.1; if ($invalid_referer) { return 404; } root /ftpvideo/video; }
location / { root html; index index.html index.htm; }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
安装 vsftpd
#查询是否安装
[root@localhost conf]# vsftpd -version
直接安装
[root@localhost conf]# yum install -y vsftpd
安装完成后创建一个目录,作为上传目录,最好和nginx 的目录一致这里我们配置为nginx里面配置的那个/ftpvideo/video
[root@localhost /]# mkdir -p /ftpvideo/video
添加一个系统账户
[root@localhost /]# useradd -d /ftpvideo/video -s /bin/bash ftpadmin
-d指定 用户的家目录,以后用做ftp上传的目录.-s指定是否可以登录 ,最后是用户名称.
设置密码
可以使用passwd命令设置,但是密码强度要求较高,我是自己的虚拟机,所以简单点.
[root@localhost /]# echo 123456|passwd --stdin ftpadmin
可能要修改防火墙,这里我是关闭了防火墙,所以不用设置,具体的我也不知道怎么设置,百度吧.
为了安全,我们要设置用户只能访问自己的家目录,也就是我们配置的那个/ftpvideo/video
修改/etc/vsftpd.conf
[root@localhost vsftpd]# cd /etc/vsftpd/
[root@localhost vsftpd]# vi vsftpd.conf
把下面这几个改为NO,关闭匿名访问
anonymous_enable=NOlocal_enable=NOwrite_enable=NO
取消chroot_local_user=YES的注释
ascii_upload_enable=YESascii_download_enable=YES
在最后添加
allow_writeable_chroot=YES
设置开机启动
[root@localhost vsftpd]# systemctl enable vsftpd.service
启动ftp
[root@localhost vsftpd]# systemctl start vsftpd.service
设置不能登录linux
[root@localhost vsftpd]# usermod -s /usr/sbin/nologin ftpadmin
链接测试
可以登录,但是无法上传文件,最后分析是权限问题
chmod -R 777 /ftpvideo
参考:
最后提供一个Java操作ftp的类
import org.apache.commons.net.ftp.FTPClient;
import java.io.*;
import java.util.logging.Logger;
/**
* 含义:ftp的上传下载处理对象
*/
public class FtpFileTransfer {
private FTPClient ftpClient = null;//ftp客户端对象
private static String hostname = null;//FTP主机名称
private static Integer port = 0; //FTP服务端口
private static String userName = null;//FTP服务器登录用户名
private static String passwd=null;//FTP服务器登录密码
private final String SPAPRATE_TOEKN = "/";
private Logger logger = Logger.getLogger(this.getClass().getName());
/**
* 从配置文件中获取配置值
*/
public FtpFileTransfer(String hostname,int port,String userName,String passwd){
this.hostname = hostname;
this.port = port;
this.userName = userName;
this.passwd = passwd;
}
/**
* 方法描述:上传文件
* @param srcPath 源文件路径
* @param ftpPath FTP端存放路径
* @param targetName FTP端存放名称
* @return 操作是否成功
*/
public boolean uploadFile(String srcPath,String ftpPath, String targetName){
boolean ret = false;
File file = new File(srcPath);
ret = uploadFile(file, ftpPath, targetName);
return ret;
}
/**
* 方法描述:上传文件
* @param file 待上传的文件
* @param ftpPath 目标文件路径
* @param targetName 目标名称
* @return
*/
public boolean uploadFile(File file,String ftpPath,String targetName){
if(file == null){
logger.info("File is null");
return false;
}
try {
InputStream is = new FileInputStream(file);
return uploadFileStream(is, ftpPath, targetName);
} catch (FileNotFoundException e) {
return false;
}
}
/**
* 方法描述:上传文件
* @param is 源文件流
* @param ftpPath 放置在服务器上的位置
* @param targetName 放置在服务器上的名称
* @return 操作是否成功
*/
public boolean uploadFileStream(InputStream is,String ftpPath, String targetName) {
boolean ret = false;
if(is == null){
logger.info("File is null");
return ret;
}
ret = this.connect2Ftp();
if(!ret){
logger.info("connect to ftp server failure");
this.disconnect2Ftp();
return ret;
}
try {
boolean mkdir = this.makeDir(ftpPath);
if(ftpPath.startsWith(SPAPRATE_TOEKN)){
ftpPath = ftpPath.substring(ftpPath.indexOf(SPAPRATE_TOEKN)+SPAPRATE_TOEKN.length());
}
ret = ftpClient.changeWorkingDirectory(ftpPath);
if(ret){
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("utf-8");
ftpClient.enterLocalPassiveMode();
ret = ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
if(ret){
ret = ftpClient.storeFile(targetName, is);
}
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("FTP客户端出错!", e);
} finally {
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
disconnect2Ftp();
}
return ret;
}
/**
* 方法描述:下载文件
* @param remoteFileName FTP上的文件名称,含路径
* @param localFilePath 取到文件到本地后文件的存放位置
* @return 操作是否成功
*/
public boolean downloadFile(String remoteFileName, String localFilePath){
boolean ret = false;
remoteFileName = remoteFileName.trim();
if(remoteFileName.startsWith(SPAPRATE_TOEKN)){
remoteFileName = remoteFileName.substring(remoteFileName.indexOf(SPAPRATE_TOEKN)
+SPAPRATE_TOEKN.length());
}else if(remoteFileName.startsWith("\\")){
remoteFileName = remoteFileName.substring(remoteFileName.indexOf("\\")
+"\\".length());
}
String path = null;
if(!remoteFileName.contains("//")){
if(remoteFileName.contains("/")){
remoteFileName=remoteFileName.replace("/", "\\");
}
}
path = remoteFileName.substring(0,remoteFileName.lastIndexOf("\\"));
String fileName = remoteFileName.substring(path.length()+2);
FileOutputStream fos = null;
try {
ret = connect2Ftp();
if(!ret){
disconnect2Ftp();
return ret;
}
ret = ftpClient.changeWorkingDirectory(path);
fos = new FileOutputStream(localFilePath);
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("utf-8");
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ret = ftpClient.retrieveFile(fileName, fos);
} catch (IOException e) {
throw new RuntimeException("FTP客户端出错!", e);
} finally {
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
disconnect2Ftp();
}
return ret;
}
/**
* 方法描述:删除FTP服务器上的文件
* @param filePath 文件名称
* @return 删除成功/失败
*/
public boolean deleteFile(String filePath){
boolean ret = false;
if(filePath == null || filePath.isEmpty() || filePath.equals("")){
return false;
}
try {
connect2Ftp();
ftpClient.changeWorkingDirectory("\\");
ret = ftpClient.deleteFile(filePath);
} catch (IOException e) {
}finally{
disconnect2Ftp();
}
return ret;
}
/**
* 方法描述:删除文件夹
* @param dirPath 文件夹路径
* @param force 是否强制删除
* @return 是否删除成功
*/
public boolean deleteDirs(String dirPath, boolean force){
boolean ret = false;
if(dirPath.startsWith(SPAPRATE_TOEKN)){
dirPath = dirPath.substring(dirPath.indexOf(SPAPRATE_TOEKN)+SPAPRATE_TOEKN.length());
}
String path = dirPath;
try {
ret = ftpClient.changeWorkingDirectory(dirPath);
String[] names = ftpClient.listNames();
if(force){
for(String name:names){
if(dirPath.endsWith(SPAPRATE_TOEKN)){
ret = deleteFile(dirPath+name);
}else{
ret = deleteFile(dirPath+SPAPRATE_TOEKN+name);
}
}
}
ret = ftpClient.changeWorkingDirectory("//");
while(true){
ret = ftpClient.removeDirectory(path);
if(path.contains(SPAPRATE_TOEKN)){
path = path.substring(0, path.lastIndexOf(SPAPRATE_TOEKN));
}else{
break;
}
}
} catch (Exception e) {
}
return ret;
}
/**
* 方法描述:连接到远端的FTP服务器
* @return 是否连接成功
*/
private boolean connect2Ftp(){
boolean ret = false;
ftpClient = new FTPClient();
try {
ftpClient.connect(hostname, port);
ret = ftpClient.login(userName, passwd);
logger.info("Finished login the ftp server, result="+ret);
} catch (Exception e) {
}
return ret;
}
/**
* 方法描述:断开ftp链接
*/
private void disconnect2Ftp(){
if(ftpClient != null){
try {
ftpClient.disconnect();
} catch (IOException e) {
}
}
}
/**
* 方法描述:根据目录要求创建ftp端的文件夹路径
* @param dir 文件夹路径,如:绝对路径,/ab/cde/ef/hg,相对路径, ab/cd
* @return 是否创建成功
* @throws IOException
*/
private boolean makeDir(String dir) throws IOException{
boolean ret = false;
int i = 0;
if(dir != null && !dir.isEmpty()){
String[] dirs = null;
int len = 0;
if(dir.contains("//")){
dir = dir.replace("//", SPAPRATE_TOEKN);
i = 1;
}
if(dir.contains(SPAPRATE_TOEKN)){
dirs = dir.split(SPAPRATE_TOEKN);
len = dirs.length;
StringBuffer sb = new StringBuffer();
for(;i<len;i++){
sb.append(dirs[i]);
sb.append(SPAPRATE_TOEKN);
ret = ftpClient.makeDirectory(sb.toString());
}
}else{
ret = ftpClient.makeDirectory(dir);
}
}
return ret;
}
public boolean isFileExist(String filePath) {
connect2Ftp();
boolean ret = false;
try {
String rt = ftpClient.getModificationTime(filePath);
if (rt != null && !rt.isEmpty()) {
ret = true;
}
} catch (IOException e) {
} finally {
disconnect2Ftp();
}
return ret;
}
}