南京大学服务器 Docker 搭建 UOJ 系统全攻略

0 下载量 201 浏览量 更新于2024-08-03 收藏 527KB DOCX 举报
"南京大学服务器上搭建UOJ系统的详细教程" 在南京大学服务器上搭建UOJ(University Online Judge)系统是一项技术性的工作,旨在为教学环境提供一个在线编程作业平台。本文将详述这一过程,包括申请服务器、安装Docker以及部署UOJ系统。 首先,你需要申请南京大学的服务器资源。通常,这需要通过学校的信息技术服务部门或者相关管理平台进行。登录并按照指引完成服务器的申请流程,获取服务器的远程访问权限。例如,2023年的连网代码可能为`curl 'http://p2.nju.edu.cn/portal_io/login?' -d "username=usm&password=pwd"`,但请注意,每年的连接方式可能会有所变化,因此需要根据最新的官方指南更新连接信息。 接下来,我们进入服务器并开始搭建Docker环境。Docker是一个开源的应用容器引擎,它允许我们将应用程序及其依赖打包成容器,方便在不同的环境中快速部署。在Ubuntu系统上安装Docker的步骤如下: 1. 更新系统软件包列表:`sudo apt-get update` 2. 安装必要的工具:`sudo apt-get install ca-certificates curl gnupg` 3. 添加Docker的GPG密钥:`curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg` 4. 设置Docker的Apt仓库:`echo ... | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null` 5. 再次更新软件包列表:`sudo apt-get update` 6. 安装Docker CE(Community Edition):`sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin` 安装完成后,你可以通过`docker --version`命令检查Docker是否成功安装。接下来,我们需要下载并运行UOJ系统的Docker镜像。UOJ通常会提供详细的部署文档,包括如何从Docker Hub或其他镜像仓库拉取UOJ的镜像,以及如何配置和启动服务。这通常涉及以下步骤: 1. 拉取UOJ镜像:`docker pull uoj/your_uoj_image_name` 2. 创建数据卷以持久化数据:`docker volume create uoj_data` 3. 启动UOJ容器,将数据卷挂载到正确位置,并设置必要的环境变量和端口映射:`docker run -d -p 80:80 --name uoj_container -v uoj_data:/var/www/uoj/data your_uoj_image_name` 确保在启动容器时,根据UOJ的文档配置好所有必要的环境变量,例如数据库连接信息、管理员账号等。一旦容器运行起来,你就可以通过浏览器访问服务器的IP地址来访问UOJ系统了。 最后,为了便于助教管理和维护UOJ系统,你可能还需要设置一些额外的工具,如监控系统状态、定期备份数据、更新系统及软件等。这些都可以借助Docker的其他工具和服务来实现,比如使用Docker Compose来管理多个容器,或者集成Prometheus和Grafana进行监控。 搭建UOJ系统需要对Linux服务器管理、Docker容器技术和在线编程平台有一定的了解。遵循上述步骤,并结合UOJ的官方文档,你应该能够成功地在南京大学的服务器上构建并运行一个功能完备的UOJ系统,从而辅助教学工作,提高课堂作业的发布与评估效率。
2018-03-28 上传
一 vsftpd搭建步骤 1、首先安装vsftpd,并设置开机启动 yum -y install vsftpd chkconfig vsftpd on 2、基于虚拟用户配置,(所谓虚拟用户就是没有使用真实的帐户,只是通过映射到真实帐户和设置权限的目的。虚拟用户不能登录CentOS系统)  2.1 配置参数 [root@ftp vuser_conf]# sed -n '/^[^#]/P' /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_file=/var/log/xferlog xferlog_std_format=YES idle_session_timeout=600 data_connection_timeout=120 ascii_upload_enable=YES ascii_download_enable=YES chroot_list_enable=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES guest_enable=YEs guest_username=ftp user_config_dir=/etc/vsftpd/vuser_conf pasv_enable=YES pasv_min_port=40000 pasv_max_port=40080 pasv_promiscuous=YES accept_timeout=60 connect_timeout=60  2.2 参数解释 [root@ftp /]# sed -n '/^[^#]/P' /etc/vsftpd/vsftpd.conf #设定不允许匿名访问 anonymous_enable=NO #设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问 local_enable=YES #允许用户上传数据(包括文档与目录) write_enable=YES #建立新目录(775)与档案(644)的权限 local_umask=022 #若目录下有.message则显示该文档内容 dirmessage_enable=YES #启动登录文件记录,记录于 /var/log/xferlog xferlog_enable=YES #支持主动式联机功能 connect_from_port_20=YES #如果上一个xferlog_enable=YES的话,这里可以设定了!这个是登录档案的档名。 xferlog_file=/var/log/xferlog #是否设定为 wu ftp 相同的登录档格式?预设为 NO ,因为登录档会比较容易读! 不过,如果你有使用 wu ftp 登录文件的分析软件,这里才需要设定为 YES xferlog_std_format=YES #若匿名者发呆超过 10 分钟就断线 idle_session_timeout=600 #如果服务器与客户端的数据联机已经成功建立 (不论主动还是被动联机),但是可能由于线路问题导致 120 秒内还是无法顺利的完成数据的传送,那客户端的联机就会被我们的 vsftpd 强制剔除! data_connection_timeout=120 #如果设定为 YES ,那么 client 就优先 (预设) 使用 ASCII 格式上传文件。 ascii_upload_enable=YES #如果设定为 YES ,那么 client 就优先 (预设) 使用 ASCII 格式下载文件。 ascii_download_enable=YES #是否启用 chroot 写入列表的功能?与底下的 chroot_list_flie 有关!这个项目得要开启,否则底下的列表档案会无效。 chroot_list_enable=YES #若设定为 YES 表示 vsftpd 是以 standalone 的方式来启动的!预设是 NO !所以我们的 CentOS 将它改为 YES !这样才能使用 stand alone 的方式来唤醒。 listen=YES #这个是 pam 模块的名称,我们放置在 /etc/pam.d/vsftpd 即是这个。 pam_service_name=vsftpd #支持 /etc/vsftpd/user_list 档案内的账号登入管控! userlist_enable=YES #支持 TCP Wrappers 的防火墙机制 tcp_wrappers=YES #若这个值设定为 YES 时,那么任何实体账号,均会被假设成为 guest (所以预设是不开放的)! 至于访客在 vsftpd 当中,预设会取得 ftp 这个使用者的相关权限。但可以透过 guest_username 来修改。 guest_enable=YES #指定虚拟用户的宿主用户,CentOS中已经有内置的ftp用户了 guest_username=ftp # FTP服务文件(配置文件名=虚拟用户名) user_config_dir=/etc/vsftpd/vuser_conf #支持数据流的被动式联机模式(passive mode),一定要设定为 YES pasv_enable=YES #在防火墙配置内开启40000到40080端口(没有测试过) -A INPUT -m state --state NEW -m tcp -p -dport 40000:40080 -j ACCEPT pasv_min_port=40000 pasv_max_port=40080 #是否屏蔽对pasv进行安全检查,(当有安全隧道时可禁用) pasv_promiscuous=YES #当用户以被动式 PASV 来进行数据传输时,如果服务器启用 passive port 并等待 client 超过 60 秒而无回应, 那么就给他强制断线!这个设定值与 connect_timeout accept_timeout=60 #单位是秒,在数据连接的主动式联机模式下,我们发出的连接讯号在 60 秒内得不到客户端的响应,则不等待并强制断线 connect_timeout=60  2.3 FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。 一、PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。 当需要传送数据时,客户端在命令链路上用 PORT命令告诉服务器:“我打开了****端口,你过来连接我”。于是服务器从20端口向客户端的****端口发送连接请求,建立一条数据链路来传送数据。 二、PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。 当需要传送数据时,服务器在命令链路上用 PASV命令告诉客户端:“我打开了****端口,你过来连接我”。于是客户端向服务器的****端口发送连接请求,建立一条数据链路来传送数据。 从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完全不同。而FTP的复杂性就在于此。 3 进行认证  安装Berkeley DB工具,很多人找不到db_load的问题就是没有安装这个包 yum install db4 db4-utils  创建用户密码文本,注意奇行是用户名,偶行是密码 [root@ftp /]# cat /etc/vsftpd/vuser_passwd.txt lixiang 8qu.com.cn shuaicong 8qu.com.cn gaojingyuan 8qu.com.cn  生成虚拟用户认证的db文件 db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db 注:(每添加一用户和秘密就得生成一次)  编辑认证文件,全部注释掉原来语句,再增加以下两句 [root@ftp /]# cat /etc/pam.d/vsftpd #%PAM-1.0 #session optional pam_keyinit.so force revoke #auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed #auth required pam_shells.so #auth include password-auth #account include password-auth #session required pam_loginuid.so #session include password-auth auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd account required pam_userdb.so db=/etc/vsftpd/vuser_passwd  创建虚拟用户配置文件 mkdir /etc/vsftpd/vuser_conf/ -p [root@ftp /]# cd /etc/vsftpd/vuser_conf/  文件名等于vuser_passwd.txt里面的账户名,否则下面设置无效 [root@ftp /]# cat /etc/vsftpd/vuser_passwd.txt lixiang 8qu.com.cn shuaicong 8qu.com.cn gaojingyuan 8qu.com.cn [root@ftp /]# cd /etc/vsftpd/vuser_conf/ [root@ftp vuser_conf]# ll total 12 -rw-r--r-- 1 root root 159 Apr 1 17:57 gaojingyuan -rw-r--r-- 1 root root 161 Apr 1 16:27 lixiang -rw-r--r-- 1 root root 161 Apr 1 17:00 shuaicong  虚拟用户根目录,根据实际情况修改 #指定虚拟用户的具体主路径。 local_root=/data/ftp #设定可以进行写操作 write_enable=YES # umask = 022 时,新建的目录 权限是755,文件的权限是 644 umask = 077 时,新建的目录 权限是700,文件的权限时 600。这里应该是anonymous用户创建的文件权限。 anon_umask=022 #仅允许 anonymous 具有下载可读档案的权限 anon_world_readable_only=NO #是否让 anonymous 具有上传数据的功能,默认是 NO,如果要设定为 YES ,则 anon_other_write_enable=YES 必须设定 anon_upload_enable=YES #是否让 anonymous 具有建立目录的权限?默认值是 NO!如果要设定为 YES, 那么 anony_other_write_enable 必须设定为 YES ! anon_mkdir_write_enable=YES #是否允许 anonymous 具有除了写入之外的权限?包括删除与改写服务器上的档案及档名等权限。预设当然是 NO!如果要设定为 YES, anon_other_write_enable=YES 4 设置FTP根目录权限  最新的vsftpd要求对主目录不能有写的权限所以ftp为755,主目录下面的子目录再设置777权限 mkdir /data/ftp chmod -R 755 /data chmod -R 777 /data/ftp [root@ftp data]# ls -ld /data/ drwxr-xr-x 3 root root 4096 Apr 1 16:25 /data/ [root@ftp data]# ll total 4 drwxrwxrwx 2 root root 4096 Apr 1 17:21 ftp  建立限制用户访问目录的空文件(不需要也得创建) touch /etc/vsftpd/chroot_list  如果启用vsftpd日志需手动建立日志文件 touch /var/log/xferlog touch /var/log/vsftpd.log  重启iptabls和vsftpd service iptables restart service vsftpd restart 5 Selinux和防火墙  该关闭的关闭,该放行的放行 1 2 3 4 5 #关闭selinux/iptables sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config setenforce 0 chkconfig iptables off service iptables stop 常见问题 如果登录时出现 500 OOPS: priv_sock_get_result. Connection closed by remote host. 这样的错误,需要升级pam yum update pam 6日志分析 vsftpd的两个日志文件分析如下: /var/log/xferlog 记录内容举例 /var/log/vsftpd.log Sat Apr 1 16:34:14 2017 1 10.13.98.101 55 /vsftpd(1).txt b _ i g lixiang ftp 0 * c /var/log/xferlog日志文件中数据的分析和参数说明 记录数据 参数名称 参数说明 Thu Sep 6 09:07:48 2007 当前时间 当前服务器本地时间,格式为: DDD MMM dd hh:mm:ss YYY 7 传输时间 传送文件所用时间,单位为秒 192.168.57.1 远程主机名称/IP 远程主机名称/IP 4323279 文件大小 传送文件的大小,单位为byte /home/student/phpMyadmin- 2.11.0-all-languages.tar.gz 文件名 传输文件名,包括路径 b 传输类型 传输方式的类型,包括两种: a以ASCII传输 b以二进制文件传输 – 特殊处理标志 特殊处理的标志位,可能的值包括: _ 不做任何特殊处理 C 文件是压缩格式 U 文件是非压缩格式 T 文件是tar格式 i 传输方向 文件传输方向,包括两种: o 从FTP服务器向客户端传输 i 从客户端向FTP服务器传输 r 访问模式 用户访问模式,包括: a 匿名用户 g 来宾用户 r 真实用户,即系统中的用户 student 用户名 用户名称 ftp 服务名 所使用的服务名称,一般为FTP 0 认证方式 认证方式,包括: 0 无 1 RFC931认证 * 认证用户id 认证用户的id,如果使用*,则表示无法获得该id c 完成状态 传输的状态: c 表示传输已完成 i 表示传输示完成