• linux 安装nginx ftp


    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=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

    链接测试 

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

    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;
        }
    }
  • 相关阅读:
    CSP 201612-3 权限查询 【模拟+STL】
    Vijos 1565 多边形 【区间DP】
    制作进度条(UISlider)
    制作按钮(Button)
    制作UI纹理(UI Texture)
    制作标签(Label)
    什么是UI控件
    制作精灵(UI Sprite)
    深度(Depth)概念
    2D UI和3D UI的工作原理
  • 原文地址:https://www.cnblogs.com/songfahzun/p/8490729.html
Copyright © 2020-2023  润新知