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,看看效果

linux 安装nginx ftp

 

看到这个图表示成功了.

 修改配置支持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=NO

local_enable=NO

write_enable=NO

取消chroot_local_user=YES的注释

ascii_upload_enable=YES
ascii_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

链接测试 

linux 安装nginx ftp

可以登录,但是无法上传文件,最后分析是权限问题

chmod -R 777 /ftpvideo

参考:

原文出处:csdn -> http://blog.csdn.net/wangkai_123456/article/details/78612656

https://www.centos.bz/2017/12/centos7%E9%83%A8%E7%BD%B2vsftpd%E6%9C%8D%E5%8A%A1/

 最后提供一个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;
    }
}