一个垃圾的服务器运维指南

最后由 Tabing010102 更新于 2019年12月15日

190914更新:s3重装,在MuZhou大佬的钦点下,我通过前几天的重装滚过来更新这篇文章。

本片的指南,,或者说“指南”全部是基于我的垃圾服务器s3的配置而写成的,基本可以说是个人的习惯,而且有很多仅仅是Linux的约定俗成,有经验的人士大概不用看这个东西,如果要看的话,也请仅作为参考,而不是照搬照抄,这样可能会产生意料之外的问题。

首先是操作系统,由于我用不太惯apt包管理器,于是就选择了免费的CentOS作为服务器的长期操作系统,但是有一些软件仅支持Ununtu(如MC基岩版的服务端),可以用docker解决,,系统的话也只是个人偏好,请根据自己的习惯进行选择。以下全部操作均根据CentOS7作为主操作系统。

(我现在都开始怀疑这到底是不是一个教程了,,)

刚开始从运营商那里拿到装好基本系统的服务器的时候,一般需要经过如下配置:

关闭SELinux(当然你会用的话可以不关),若配置不当可能导致各种Permission Denied或Web服务器报5xx,各种Web如PHP等无法正常运行

#查看当前SELinux状态
getenforce
#Enforcing是启用
#Disabled是禁用

#临时关闭,立即生效
setenforce 0

#永久关闭:修改/etc/sysconfig/selinux中SELINUX项更改为disabled
#注意:此操作需要重新启动服务器才能生效

更改sshd运行端口及其他安全设置,请确保防火墙已经开启相应端口

#更改/etc/ssh/sshd_config文件
...
Port xxxxx #xxxxx为你需要的端口号
PasswordAuthentication yes #允许使用密码登录
PermitRootLogin yes #允许root登录
...
systemctl restart sshd #重启sshd以使配置文件生效

更改密码 :passwd [user],若不填[user],则是当前账户

防火墙(我用的FirewallD)开放新的sshd和其他需要的端口,此外,可能需要禁用默认启用的iptablesip6tables,请根据实际情况操作,如没有该软件包可以通过yum install firewalld安装

systemctl stop iptables ip6tables #关闭iptables和ip6tables
systemctl disable iptables ip6tables #停止iptables和ip6tables的开机自启
************************
警告:请确保您有其他访问终端的权限(如主机运营商提供的网页shell或者实时终端等),否则直接开FirewallD可能导致您无法登录服务器
************************
systemctl start firewalld #启动FirewallD
systemctl enable firewalld #配置FirewallD开机自启
#注意,该操作后请重新启动docker类需要本地nat的应用程序,否则可能导致容器/虚拟机内的系统无法访问网络

#FirewallD管理命令
#注意:带--permanent参数的操作会永久保存并在重启/重新载入规则后生效,而无此参数的操作会在重启/重新载入规则后失效
#注:--zone=public指域,若无特殊情况请使用public域
firewall-cmd --zone=public --add-port=12345/xxx [--permanent] #[临时/永久]添加端口为12345,类型为xxx(tcp/udp)的端口开放
firewall-cmd --zone=public --remove-port=12345/xxx [--permanent] #[临时/永久]移除端口为12345,类型为xxx(tcp/udp)的端口开放
firewall-cmd --zone=public --list-ports [--permanent] #查看[现在/规则表中永久]生效的规则
firewall-cmd --reload #重新载入FirewallD规则

除此之外我一般会把root禁用(防止暴力破解),然后开一个自己的账号授予root身份(伪root账户),具体操作的话,先建立账户,设置密码,然后编辑"/etc/passwd"文件如下:

#/etc/passwd 修改前
root:x:0:0:root:/root:/bin/bash
...
YourAccount:x:1???:1???::/home/YourAccount:/bin/bash
#1???指一个数字,不确定是多少

#修改后
root:x:0:0:root:/root:/sbin/nologin
#/sbin/nologin是不能登录的
...
YourAccount:x:0:0:root:/root:/bin/bash
#把uid改成0就和root账户没什么区别

这样,root账户便不能登录,新建的YourAccount账户就有了全套的root权限(事实上就是root账户),这样可以进一步避免被暴力破解root(高权限,账户名已知)密码的风险。读者还可以仅使用秘钥验证来进一步增加安全性。

至于Web那一套服务器,我使用的是LNMP(Nginx+MySQL+PHP),安装的话,我使用的是lnmp.org所制作的一个一键安装/管理脚本,原因是方便管理和升级之类的操作。

脚本的话使用的是编译安装,所以在ARM设备上也是可以使用的(armv6-armv8均可),理论上可以在任何平台使用(前提是有相应的编译器),建议开一个screen(虚拟终端)进行安装,整个过程花费一小时到数小时不等,下面贴上来screen的基本使用方法以及安装时的可配置项:

yum install screen #安装screen

screen -S xxx #开启一个别名为xxx的screen
screen -r xxx #恢复(连接)一个别名为xxx的终端,若只有一个screen,则可以省略xxx参数
#注:若不确定,则请通过提示输入完整名称
#注2:在screen内,可使用先按Ctrl+A再按Ctrl+D返回上一终端(detached),直接Ctrl+D退出当前screen
#注3:screen支持嵌套,虽然不建议这么做

在解压出的lnmp脚本根目录中,有"lnmp.conf",这个文件可以自定义NginxPHP的编译参数,例如:若我想直接将nginx_rtmp_module编译进nginx,则可以在"lnmp.conf"文件中的"Nginx_Modules_Options"参数加上"--add-module=/path/to/nginx-rtmp-module",PHP同理,具体请查阅configure help

另外,PHP还支持编译后动态添加扩展(动态编译扩展而不需要重新编译php,php编译时间太长),方法如下:

yum groupinstall "Development Tools" #安装必要编译工具

#解压php源代码至/path/to/phpsrc/,并进入/path/to/phpsrc/ext/文件夹中
#现以fileinfo扩展举例:
cd ./fileinfo
/path/to/php/bin/phpize #配置configure
./configure --with-php-config=/path/to/php/bin/php-config #配置Makefile
#注:部分module有其他configure参数
#注2:phpize以及php-config在lnmp一键安装脚本中默认位置为/usr/local/php/bin/
make && make install

#修改php.ini
...
extension=fileinfo
...
注:lnmp一键脚本中php.ini的默认位置为/usr/local/php/etc/php.ini

#重启php-fpm
lnmp php-fpm restart

然后下面是基本的默认存放地址(Web相关,LNMP脚本版本1.6):

/home/wwwroot/ #网站根目录
/usr/local/nginx/ #nginx相关目录
/usr/local/nginx/conf/vhost/ #虚拟主机配置文件目录
/usr/local/nginx/conf/ssl/ #脚本自带证书申请默认存放目录
/usr/local/php/ #php相关目录

其他的说实话我也不记得了,,不怎么用,需要的话直接去lnmp.org查就好了。个人建议用vhost实现多个不同功能的网页/网站,不推荐写到一个配置文件或一个server块下。

顺带说一句,这个脚本创建虚拟主机(vhost)的时候,会在"/home/wwwroot/"相应文件夹内添加一个".user.ini",这个玩意还不能直接删除,需要执行chattr -i [file]解锁,如果只是修改的话,改完了记得加上锁(虽然我也不知道这个干什么用的)chattr +i [file]。至于升级的话,,参见这篇博客,,(注:lnmp1.6默认添加了TLS1.3的支持)

补充:一般为了避免网页编码问题,我会在nginx配置文件的server块后加"charset utf-8;",实现强制使用https的方法是在监听80端口的server后加入"rewrite ^(.*)$ https://$host$1 permanent;"

对于很多没有预编译包但提供源代码的软件,可以尝试加入epel源再试试yum安装(主要为x86平台),方法如下:

yum -y install epel-release
yum update

然后再尝试yum安装你需要安装的软件。

也可以采用编译安装的方法(更通用,适用所有处理器架构),一般情况下系统提供的gcc/c++或其他语言的库都足够进行编译,但也不排除glibc或其他依赖库版本不够的情况,这种情况就比较麻烦了,,

一般情况下编译安装的软件"/usr/local/"路径下(可能是约定俗成),一般软件的默认路径也都是这样,若不是,一般也手动指定到"/usr/local/“中,编译安装的一般指令如下:

cd /path/to/source_code/
./configure --prefix=/path/to/install_dir
#--prefix是指定安装路径的,可选。也可以加其他参数,具体看软件说明。也可能是其他配置指令
make -j4 #4线程编译,可指定。若编译失败请使用单线程(去掉-j选项)
make install #安装

一般编译安装时间较长,建议开一个screen或其他类似工具让他待在后台。还有时会出现编译配置不正确,出现某个文件编译不过去(编译选项少了-liconv等),这是可以手动编译相关文件,再试试继续执行make指令。

如果在安装或进行其他操作时提示无权限(Permission Denied),请使用sudo指令或使用更高权限账户。若还有问题,请检查相关文件/服务的操作权限。

关于ownCloud的搭建及各种问题(虽然后来用的NextCloud),参见这篇博客

关于ngrok开源版的搭建方法,参见这篇博客

关于CentOS中的使用Docker搭建Ubuntu环境并运行MineCraft基岩版服务器,参见这篇博客

关于Seafile的搭建(x86,armv7)及各种问题,参见这篇博客

关于OpenTracker的编译安装,参见这篇博客

若有任何意见或建议,请在评论区评论

Visits: 64

发布者:Tabing010102

???

加入对话

1条评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据