快速装机 ubuntu+ngnix+mysql+django;Jupyter;音频处理librosa;...
我想要的是在服务器上放我的博客(django搭建)或者其它的网页(80端口),然后另外几个端口放一些自己用的东西(Jupyter让我可以用手机/pad之类可以联网的设备随时通过网页编程,phpmyadmin查看数据库等)。
服务器环境为一台全空的阿里云ubuntu 14.04。
ssh登陆免输密码
首先肯定是做这一步,不然每次都输入密码是非常麻烦的。首先ssh登陆到服务器上,然后在服务器上安装ssh。
apt-get update
apt-get upgrade
apt-get install ssh
安装好ssh后。
mkdir .ssh
好了,然后可以暂时退出服务器了。
回到本地,提前在本机上运行ssh-keygen生成你自己的rsa秘钥(当然大部分人已经有了)并在本机装好ssh-copy-id。
ssh-copy-id yourUserName@yourServerIp
完成。
python科学计算 + Jupyter
课题组研究方向是音频处理,除了matlab(matlab很萌的,你们不要黑它),python的使用也是比较频繁的,在windows上,python环境的搭建比起MATLAB稍微繁琐一些,一个自然的想法就是在*nix服务器上搭好环境后通过网页访问它,Jupyter(前身是ipython notebook)就是这样一个项目。
反正一口气装一下以下这些软件(通过apt安装的pandas/scipy等包版本会比较旧,但是省了编译时间,想使用较新版本可以用pip安装):
apt-get install python-matplotlib python-scipy python-pip software-properties-common python-sklearn python-pandas git
因为ipython有重大版本更新,为了获得新版本的ipython,就不通过apt-get来安装ipython了,我们使用pip,使用pip前我们更换一下pip源为国内源(服务器买在国外当然就略过这一步咯),需要创建或者更改pip配置文件(linux的文件在~/.pip/pip.conf,windows在%HOMEPATH%\pip\pip.ini),修改内容为:
[global]
index-url = http://pypi.douban.com/simple
trusted-host = pypi.douban.com
然后
pip install ipython jupyter
当然你也可以使用python3,apt-get install比pip安装更快,所以能偷懒就偷懒了:
apt-get install python3-matplotlib python3-scipy python3-pandas python3-pip
pip3 install ipython jupyter
然后是把Jupyter作为服务器,直接移步:Running a notebook server,我这里记录的简要版本只供自己回忆:
先是在ipython生成秘钥:
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed'
然后
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mykey.key -out mycert.pem
jupyter notebook --generate-config
vim .jupyter/jupyter_notebook_config.py
修改为
# Set options for certfile, ip, password, and toggle off
# browser auto-opening
c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem'
c.NotebookApp.keyfile = u'/absolute/path/to/your/certificate/mykey.key'
# Set ip to '*' to bind on all interfaces (ips) for the public server
c.NotebookApp.ip = '*'
c.NotebookApp.password = u'sha1:bcd259ccf...'
c.NotebookApp.open_browser = False
# It is a good idea to set a known, fixed port for server access
c.NotebookApp.port = 9999
然后
nohup jupyter notebook &
就可以在后台运行了(nohup的方式比较粗糙,更好的是用tmux/screen之类的,又或者写到/etc/init/里作为一个service启动),效果如下,记得是用 https 访问:
音频处理librosa
用python做音频处理,最普遍的一个问题就是读入各种格式的音频了,当然,还有一些其它需求,推荐librosa库。为了正常使用librosa,我们需要装一系列东西。
apt-get install libsndfile-dev libsamplerate-dev
安装ffmpeg作为音频读写的backend:
apt-get install software-properties-common
apt-add-repository ppa:mc3man/trusty-media
apt-get update
apt-get install ffmpeg gstreamer0.10-ffmpeg
对于python2,很简单:
pip install scikits.samplerate librosa
samplerate这个包年久失修,并不适配python3,librosa的作者fork了一个分支,并做了更新,我们安装这个(git的使用我就不啰嗦了)。
pip3 install librosa
git clone [email protected]:bmcfee/samplerate.git
cd samplerate
python3 setup.py install
大概是这么个样子:
uwsgi + ngnix + django + mysql部署博客系统
诶,把这些东西写清楚也挺费劲,今天写不动了,明天继续。
我今天又回来写了,这说明今儿心情不错!
首先你得先用django写好一个博客系统,当然开源博客方案也是一搜一大把,比如django-blog-zinnia,当然这也就少了自己折腾的乐趣。如果纯粹只是想挂个博客,也没必要自己写,使用wordpress最简单了。
安装一下uwsgi,ngnix和python-virtualenv:
apt-get install ngnix
pip install uwsgi virtualenv
或者你用python3的项目的话就pip3 install uwsgi。
为博客项目创建一个文件夹,比如名为blog,然后在里面创建配置文件夹conf,日志文件夹logs和代码文件夹src,src中放代码。文件结构大致如下:
└── blog
├── conf
├── logs
└── src
└── blog
然后conf中放你的配置文件uwsgi.ini和blog_ngnix.conf,
uwsgi.ini是这样的:
[uwsgi]
# variables
projectname = blog
projectdomain = 你的域名或者服务器ip地址
base = 项目路径
# config
# plugin = python
# 如果你是通过pip/pip3 install uwsgi安装的uwsgi,那么就不需要写plugin = python
master = true
protocol = uwsgi
env = DJANGO_SETTINGS_MODULE=%(projectname).settings
pythonpath = %(base)/src/%(projectname)
module = %(projectname).wsgi:application
socket = 127.0.0.1:8889
# socket = /var/run/uwsgi/%(projectname).sock
logto = %(base)/logs/uwsgi.log
vacuum = True
home = 你创建的virtualenv路径(这里就不啰嗦virtualenv的用法了)
# below line runs it as a daemon in background
daemonize = %(base)/logs/daemon.log
blog_ngnix.conf里写这些:
server {
listen 80;
server_name 你的域名或者服务器ip地址;
access_log 项目路径/logs/access.log;
error_log 项目路径/logs/error.log;
# 记得在django里写好STATIC_ROOT = '/var/www/blog/static/'
# 和MEDIA_ROOT = '/var/www/blog/media/',然后python manage collectstatic
location /static/ { # STATIC_URL
alias /var/www/blog/static/; # STATIC_ROOT
expires 30d;
}
location /media/ { # MEDIA_URL
alias /var/www/blog/media/; # MEDIA_ROOT
expires 30d;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8889;
# uwsgi_pass unix:///var/run/uwsgi/mir_uwsgi.sock;
}
}
然后链接blog_ngnix.conf到ngnix的site-enabled文件夹里。
ln -s pathToYourProject/conf/blog_nginx.conf /etc/ngnix/site-enabled
然后
uwsgi --ini pathToYourProject/conf/uwsgi.ini
service ngnix restart
就行了(如果你用的是80端口,那么可能需要做些调整,因为这个端口一般是被占了的,把占了80端口的东西挪开,或者你把blog放在其它端口,或者把所有东西都放80端口然后调整一下ngnix的路由规则)。
开机自动启动服务
ngnix自然是开机自启动的,但是ipython notebook和uwsgi(单指博客项目而言)都是我们手动开启的服务,如果不是以daemon的形式运行这些进程的话,ssh会话一退出,这些进程就被杀死了,这显然不是我们想要的。比较dirty的解决方案是用nohup或者screen或者tmux来运行这些进程,这样的话退出ssh会话后这些进程还会继续运行。不过如果这些进程能开机自启动,那么显然更好一些。
可以创建/etc/init/jupyter.conf文件(jupyter这名字你可以随便取):
exec sudo /usr/local/bin/jupyter notebook
start on filesystem and net-device-up IFACE!=lo
然后也可以使用service jupyter restart/stop/start了。
uwsgi与之类似,创建/etc/init/uwsgi.conf,
description "uWSGI application server in Emperor mode"
start on runlevel [2345]
stop on runlevel [!2345]
# setuid blog
# setgid www-data
respawn
exec /usr/local/bin/uwsgi --emperor /pathToYourProject/conf/uwsgi.ini
好了,终于写完了。。。这些指令我记在备忘录里才半页,写清楚竟然要这么久,感谢所有写技术博客的人。。。他们是付出了汗水的 T T.