首页 > 一台 Web 用途 Python 的Linux 服务器的目录结构、用户分组应该是怎样的?

一台 Web 用途 Python 的Linux 服务器的目录结构、用户分组应该是怎样的?

R.T.
一台运行编译安装配置 CentOS 系统、用于处理 Web 请求的服务器应该怎样处理一下关系:


分享一下我的组织方法吧,感觉应用场景和题主的差不多。

目录结构和多个磁盘挂载点

在根目录建一个 /data,将某个单独的磁盘挂载在这里。

这个目录里面包含诸多子目录。

/data
  |-- app/   # 网站程序
  |-- log/   # 各种日志
  |-- ftp/   # ftp 的根
  |-- db/  # 数据库的数据文件
  |-- op/    # op 专用的目录,放一些运维相关的脚本文档什么的
  |-- ...    # 更多的分类,根据需求添加

如果有多块磁盘也不要建立多个根,而是用软链将 /data 下某个目录链接到新的磁盘里。比如上面的 ftp/ 可以是一个软链指向其他磁盘,这样就不占用 /data 的空间了~至于其他磁盘挂在哪,这就无所谓了,你可以就放在 /mnt 里面,好找就行。

系统程序我会把它正常的装在 /usr/local/* 里面,配置放在系统常见的 /etc/ 里面,一些运行时的临时文件放在 /var/run/* 里面,但是程序 log 一定要管理起来,我会放在 /data/log/* 里。

比如 mysql,binary 放在 /usr/local/bin/mysql*,配置在 /etc/mysql/*,数据在 /data/db/mysql/3306/*,日志放在 /data/log/mysql/3306/mysql_err.log。其中 binlog 属于数据的一部分,所以放在 /data/db 里。

多用户管理

我一般为了安全会禁止系统默认账号登录,CentOSroot,同时禁用密码登录,全部只能用 key 登录,启用 UsePAM yes。具体你可以看看 /etc/ssh/sshd_config,里面有很详细的注释,不清楚的话可以上网查找。

可登录的用户越少越好,我一般就只有两个,一个普通用户,一个可以 sudo 的超级用户,这两个放在不同的 group 里面。用 PAM 策略只允许这两个 group 的用户登录,/etc/sudoers 里也是对 group 授权,这样以后万一临时要添加个帐号也方便,只需要放到对应的组里面就好。

启用应用一般就用 www-data,这是一个不允许登录的用户,shell 设置成了 /sbin/nologin

像 mysql 喜欢用 mysql 这个用户,安装的时候就会自动创建,于是也就随它去吧。

ftp 比较特别,一般用户名就叫 ftp,home 就设在 ftp 的根,不放在 /home。如果需要有多个 ftp 帐号,可以考虑用 proftpd 的虚拟帐号,免得创建很多个可以登录的帐号有安全问题。不过我自己并没有实际遇到过这种需求,所以并不清楚虚拟账号会有其他什么问题。

目录权限

目录权限我觉得不用太纠结,毕竟不是在做一个很多人用 VPS,所以只要保证 owner/group 正确,并且尽量给正常的权限就好。

比如放 web 代码的目录的 owner 是 www-data,组就是它的组,目录权限 0755。里面的目录根据情况授权,一般就是 0644,需要可执行的给改成 07540755 都可以。一些需要对普通用户保密的内容(密码配置啊什么的)设成 0600 就好了。

/data/op 这个目录特别点,因为运维脚本一般都很敏感,我倾向于设置成 owner 为 root 并且权限为 0700。不过记得不要把 /data/op 里面的目录也设置成这样的权限,没必要而且难以管理,正常即可。

SELinux

禁用掉,很烦人,不想用。


我在之前以及现在,在编写一套虚拟主机面板,因此对权限控制略有想法。在这里分享一下我设计的权限控制方案,应该算是比较严格的,当然,这可能并不是主流方案。

下文服务指的是数据库这类软件,应用是指自己编写的程序。

所有数据都放在 /home, 例如 mysql 的数据放在 /home/mysql/data; 应用的文件放在 /home/myapp/web, 每个应用用单独的用户,以隔离权限。因为数据都在 /home, 只单独挂载 /home 就可以了。

每个服务都用单独的用户来跑,各种服务不监听本地端口,而是监听 unix socket, 因为这样可以用文件系统来进行更灵活的权限控制。

大部分文件都用 750 的权限,即自己有完整权限,同组用户可以读取和运行,其他用户不可读。当一个服务需要读取另一个应用的文件的时候,把服务的用户加到被用到文件的应用的组。例如 nginx 需要读取 myapp 的静态文件,那么就把 http 加到 myapp 组里。

unix socket 略有不同,例如 myapp(Python App) 监听了一个 unix socket 提供 HTTP 服务,Nginx 需要反代这个服务,那么这个 unix socket 文件的权限需要是 770 才行,不然 Nginx 没法写这个文件就没法反代请求。

在使用数据库的时候,每个应用都要用不同的帐号,例如 MySQL 自带的非常好的权限系统。
而对于 memcached 这类没有权限控制的服务,应该为每个应用跑一个单独的实例,然后用 unix socket 做权限控制。

至于源代码的部署,我个人倾向于先将代码 push 到一个单独的源代码服务器(可以是 Github 或者自建的 GitLab), 然后发布时手动从服务器 pull. 这样的好处是生产环境有独立的历史,源码服务器上不必包含一些如帐号密码等敏感信息,这些信息只存在于生产环境的历史中。

SELinux 没用过。

【热门文章】
【热门文章】