经常我们做Linux运维配置的时候会重复查找一些教程,所以打算从运维层面开始做一些知识积累。先做一些简单的整理,后期再根据需求持续更新。
本文记录Debian Linux服务器下Python生产环境的配置流程和注意事项。
初始化操作系统:Debian Linux
1. 修改root用户密码
对一台刚安装好的Debian系统,首先应该去修改它的root用户密码。使用root用户登录远程主机。
代码语言:javascript复制ssh root@xxx.xxx.xxx.xxx
这时,命令行会出现警告,表示这是一个新的地址,存在安全风险。键入yes,表示接受。然后,就应该可以顺利登入远程主机。
接着,修改root用户的密码。
代码语言:javascript复制passwd
2. 新建用户
首先,添加一个用户组(这里假定为admin用户组)。
代码语言:javascript复制addgroup admin
然后,添加一个新用户(假定为foo)。
代码语言:javascript复制useradd -d /home/foo -s /bin/bash -m foo
上面命令中,参数d指定用户的主目录,参数s指定用户的shell,参数m表示如果该目录不存在,则创建该目录。
接着,设置新用户的密码。
代码语言:javascript复制passwd foo
将新用户(foo)添加到用户组(admin)。
代码语言:javascript复制usermod -a -G admin foo
Debian系统默认没有sudo,所以需要先安装sudo才行。
代码语言:javascript复制apt-get install sudo
接着,为新用户设定sudo权限。
代码语言:javascript复制visudo
visudo命令会打开sudo设置文件/etc/sudoers,找到下面这一行。
代码语言:javascript复制root ALL=(ALL:ALL) ALL
在这一行的下面,再添加一行。
代码语言:javascript复制root ALL=(ALL:ALL) ALL
foo ALL=(ALL) NOPASSWD: ALL
上面的NOPASSWD表示,切换sudo的时候,不需要输入密码,我喜欢这样比较省事。如果出于安全考虑,也可以强制要求输入密码。
代码语言:javascript复制root ALL=(ALL:ALL) ALL
foo ALL=(ALL:ALL) ALL
然后,先退出root用户的登录,再用新用户的身份登录,检查到这一步为止,是否一切正常。
代码语言:javascript复制exit
ssh foo@xxx.xxx.xxx.xxx
3.SSH设置
首先,确定本机有SSH公钥(一般是文件~/.ssh/id_rsa.pub
),如果没有的话,使用ssh-keygen命令生成一个(可参考我写的SSH教程)。
在本机上另开一个shell窗口,将本机的公钥拷贝到服务器的authorized_keys文件。
代码语言:javascript复制cat ~/.ssh/id_rsa.pub | ssh foo@xxx.xxx.xxx.xxx 'mkdir -p .ssh && cat - >> ~/.ssh/authorized_keys'
# 或者在服务器端,运行下面命令
echo "ssh-rsa [your public key]" > ~/.ssh/authorized_keys
然后,进入服务器,编辑SSH配置文件/etc/ssh/sshd_config
。
sudo cp /etc/ssh/sshd_config ~
sudo nano /etc/ssh/sshd_config
在配置文件中,将SSH的默认端口22改掉,可以改成从1025到65536之间的任意一个整数(这里假定为25000)。
代码语言:javascript复制Port 25000
然后,检查几个设置是否设成下面这样,确保去除前面的#号。
代码语言:javascript复制Protocol 2
PermitRootLogin no
PermitEmptyPasswords no
PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
UseDNS no
上面主要是禁止root用户登录,以及禁止用密码方式登录。 接着,在配置文件的末尾,指定允许登陆的用户。
代码语言:javascript复制AllowUsers bill
保存后,退出文件编辑。 接着,改变authorized_keys文件的权限。
代码语言:javascript复制sudo chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh/
然后,重启SSHD。
代码语言:javascript复制sudo service ssh restart
# 或者
sudo /etc/init.d/ssh restart
下面的一步是可选的。在本机~/.ssh文件夹下创建config文件,内容如下。
代码语言:javascript复制Host s1
HostName xxx.xxx.xxx.xxx
User foo
Port 25000
最后,在本机另开一个shell窗口,测试SSH能否顺利登录。
代码语言:javascript复制ssh s1
4. 运行环境配置
首先,检查服务器的区域设置。
代码语言:javascript复制locale
如果结果不是en_US.UTF-8
,建议都设成它。
sudo locale-gen en_US en_US.UTF-8 en_CA.UTF-8
sudo dpkg-reconfigure locales
然后,更新软件。
代码语言:javascript复制sudo apt-get update
sudo apt-get upgrade
最后,再根据需要,做一些安全设置,比如搭建防火墙,关闭HTTP、HTTPs、SSH以外的端口,再比如安装Fail2Ban,详细可参考这篇《Securing a Linux Server》。
安装常用软件
安装常用包
代码语言:javascript复制sudo apt-get install curl git
安装VIM
代码语言:javascript复制sudo apt-get install vim
#下载配置
curl https://gist.githubusercontent.com/fengluo/3749890/raw >> ~/.vimrc
我们使用Vundle来管理安装VIM插件
代码语言:javascript复制git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
安装好了之后可以打开vim运行
代码语言:javascript复制:PluginInstall
也可以直接从命令行安装配置
代码语言:javascript复制vim PluginInstall qall
部署Python环境
代码语言:javascript复制sudo apt-get install python-pip python-dev build-essential
# 更新pip
sudo pip install --upgrade pip
安装virtualenv
virtualenv可以帮助我们创建一个隔离的python环境。各个python应用之间应该使用独立的python环境,保证不会互相干扰。
代码语言:javascript复制sudo pip install virtualenv
安装supervisor
Supervisor是个强大的进程管理工具,帮助用户监控和控制系统进程。
代码语言:javascript复制pip install supervisor
# 如果不会写配置,可以用下面的命令来生成一个配置
echo_supervisord_conf > /etc/supervisord.conf
安装MySQL
代码语言:javascript复制sudo apt-get install mysql-server
sudo apt-get install libmysqlclient-dev
安装Nginx
代码语言:javascript复制sudo apt-get install nginx