1. 安裝 Mysql
添加 MySQL YUM 源
$wget 'https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm'
$sudorpm -Uvh mysql57-community-release-el7-11.noarch.rpm
$yum repolist all | grepmysql
mysql-connectors-community/x86_64MySQL Connectors Community???????? 36
mysql-tools-community/x86_64MySQL Tools Community??????????? 47
mysql57-community/x86_64MySQL 5.7 Community Server???????? 187
安裝最新版本
$sudoyum installmysql-community-server
啟動服務(wù)
$sudo service mysqld start
$sudo systemctl start mysqld #CentOS 7
$sudo systemctl status mysqld
● mysqld.service - MySQL Community Server
??Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
??Active: active (running) since Sat 2017-05-27 12:56:26 CST; 15s ago
?Process: 2482 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
?Process: 2421 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
?Main PID: 2481 (mysqld_safe)
??CGroup: /system.slice/mysqld.service
??????├─2481 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
??????└─2647 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/...
說明已經(jīng)正在運(yùn)行中了
修改密碼
$ mysql -uroot -p
這里有要求你輸入密碼橡淑,Mysql安裝時會生成一個默認(rèn)密碼苟耻,使用 grep "temporary password" /var/log/mysqld.log 命令,返回結(jié)果最后引號后面的字符串就是root的默認(rèn)密碼
mysql> ALTERUSER'root'@'localhost'IDENTIFIED BY'NewPassword';
修改編碼
在 /etc/my.cnf 中設(shè)置默認(rèn)的編碼
[client]
default-character-set = utf8
[mysqld]
default-storage-engine = INNODB
character-set-server = utf8
collation-server = utf8_general_ci #不區(qū)分大小寫
collation-server = utf8_bin #區(qū)分大小寫
collation-server = utf8_unicode_ci #比 utf8_general_ci 更準(zhǔn)確
創(chuàng)建數(shù)據(jù)庫
mysql> CREATEDATABASE CHARACTERSETutf8;
2. 安裝python3
CentOS 7 默認(rèn)安裝了 Python 2沦零,當(dāng)需要使用 Python 3 的時候纲熏,可以手動下載 Python 源碼后編譯安裝尘吗。
安裝 Python 3
sudo mkdir /usr/local/python3# 創(chuàng)建安裝目錄
$ wget --no-check-certificate https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz # 下載 Python 源文件
# 注意:wget獲取https的時候要加上:--no-check-certifica
$ tar -xzvf Python-3.6.2.tgz # 解壓縮包
$ cd Python-3.6.2 # 進(jìn)入解壓目錄
sudo ./configure --prefix=/usr/local/python3# 指定創(chuàng)建的目錄
sudo make
sudo make install# 編譯安裝
執(zhí)行./configure時可能會報錯,configure: error: no acceptable C compiler found in $PATH兢孝,這是因為未安裝合適的編譯器窿凤,安裝下就好了,
sudo yum install gcc-c++ (使用sudo yum install gcc-c++時會自動安裝/升級gcc及其他依賴的包西潘。)
編譯時報錯?ModuleNotFoundError: No module named '_ctypes'卷玉,3.7版本需要一個新的包libffi-devel,安裝此包之后再次進(jìn)行編譯安裝即可
解決方法:sudo yum -y install libffi-devel
重新編譯安裝即可
若在安裝前移除了/usr/bin下python的文件鏈接依賴喷市,此時yum無法正常使用相种,需要自己下載相關(guān)軟件包安裝,為節(jié)省讀者時間品姓,放上鏈接
#wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libffi-devel-3.0.13-18.el7.x86_64.rpm
#rpm -ivh libffi-devel-3.0.13-18.el7.x86_64.rpm
安裝完成后重新進(jìn)行make install寝并,結(jié)束后再次配置相關(guān)文件的軟連接即可
配置兩個版本共存
創(chuàng)建 python3 的軟鏈接:
$ sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3
這樣就可以通過 python 命令使用 Python 2, python3 來使用 Python 3腹备。
3.安裝 pip
$ sudoyum -y installepel-release # 首先安裝 epel 擴(kuò)展源
$ sudoyum -y installpython-pip # 安裝 python-pip
$ sudoyum clean all # 清除 cache
通過這種方式貌似只能安裝 pip2衬潦,想要安裝 Python 3 的 pip,可以通過以下的源代碼安裝方式植酥。
# 下載源代碼
$ wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.1.tar.gz
$ tar -zvxf 9.0.1.tar.gz? # 解壓文件
$ cd pip-9.0.1
$ python3 setup.py install# 使用 Python 3 安裝
創(chuàng)建鏈接:
$ sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
升級 pip
$ pip install--upgrade pip
4. 安裝 gunicorn
Gunicorn (獨(dú)角獸)是一個高效的Python WSGI Server,通常用它來運(yùn)行 wsgi application(由我們自己編寫遵循WSGI application的編寫規(guī)范) 或者 wsgi framework(如Django,Paster),地位相當(dāng)于Java中的Tomcat镀岛。 WSGI就是這樣的一個協(xié)議:它是一個Python程序和用戶請求之間的接口。WSGI服務(wù)器的作用就是接受并分析用戶的請求友驮,調(diào)用相應(yīng)的python對象完成對請求的處理漂羊,然后返回相應(yīng)的結(jié)果醋旦。 簡單來說gunicorn封裝了HTTP的底層實現(xiàn)朴皆,我們通過gunicorn啟動服務(wù)翎卓,用戶請求與服務(wù)相應(yīng)都經(jīng)過gunicorn傳輸
創(chuàng)建虛擬環(huán)境
cd /home/www/blog(到項目目錄下)
mkdir venv
python3 -m venv venv
激活虛擬環(huán)境:
source venv/bin/activate
然后根據(jù) requirements.txt 文件安裝依賴包:
pip3 install -r requirements.txt
安裝gunicorn:
pip3 install gunicorn
在項目根目錄創(chuàng)建一個wsgi.py文件拷貝入項目測試環(huán)境manage.py中的啟動代碼钧唐,不再通過manage.py啟動服務(wù),那只在開發(fā)的時候使用
啟動服務(wù):
gunicorn -w 4 -b 127.0.0.1:8000 wsgi:app(項目目錄名)
5. 安裝 Nginx
nginx 是一個高性能的web服務(wù)器吴攒。通常用來在前端做反向代理服務(wù)器宏侍。所謂正向與反向(reverse)潮太,只是英文說法翻譯。代理服務(wù)谆构,簡而言之裸扶,一個請求經(jīng)過代理服務(wù)器從局域網(wǎng)發(fā)出,然后到達(dá)互聯(lián)網(wǎng)上服務(wù)器低淡,這個過程的代理為正向代理姓言。如果一個請求,從互聯(lián)網(wǎng)過來蔗蹋,先進(jìn)入代理服務(wù)器,再由代理服務(wù)器轉(zhuǎn)發(fā)給局域網(wǎng)的目標(biāo)服務(wù)器囱淋,這個時候猪杭,代理服務(wù)器為反向代理(相對正向而言)。
正向代理:{ 客戶端 ---》 代理服務(wù)器 } ---》 服務(wù)器
反向代理:客戶端 ---》 { 代理服務(wù)器 ---》 服務(wù)器 }
{} 表示局域網(wǎng)
nginx既可以做正向妥衣,也可以做反向皂吮。
$ yum -y install nginx
啟動 nginx 服務(wù)
$ service nginx start
停止 nginx 服務(wù)
$ service nginx stop
重啟 nginx 服務(wù)
$ service nginx restart
平滑重啟
nginx配置改動了,可以重新加載而不用先關(guān)閉再打開
$ nginx -s reload
啟動后 税手,在瀏覽器中 輸入服務(wù)器的 ip 地址蜂筹,就可以看到nginx歡迎頁,到這里 yum 安裝 nginx 就完成了芦倒。
添加配置
nginx的配置文件為: /data/web/nginx/conf/nginx.conf(默認(rèn):/etc/nginx/nginx.conf)
server {
????listen 80;
????server_name adisonhyh.com;
????location / {
????????proxy_pass http://127.0.0.1:8000;
????????proxy_set_header Host $host;
????????proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
????}
}
監(jiān)聽http默認(rèn)的端口號80
server_name:個人網(wǎng)站域名
把請求代理到本機(jī)的8000端口(gunicorn啟動服務(wù)指定的端口) 剩下proxy_set_header照抄
重啟nginx服務(wù)器:/data/web/nginx/sbin/nginx -s reload
gunicorn和nginx關(guān)系:
gunicorn 可以單獨(dú)提供服務(wù)艺挪,但生產(chǎn)環(huán)境一般不這樣做。首先靜態(tài)資源(jscssimg)會占用不少的請求資源兵扬,而對于 gunicorn 來講它本身更應(yīng)該關(guān)注實際業(yè)務(wù)的請求與處理而不應(yīng)該把資源浪費(fèi)在靜態(tài)資源請求上麻裳;此外,單獨(dú)運(yùn)行 gunicorn 是沒有辦法起多個進(jìn)程多個端口來負(fù)載均衡的器钟。
nginx 的作用就是彌補(bǔ)以上問題津坑,首先作為前端服務(wù)器它可以處理一切靜態(tài)文件請求,此時 gunicorn 作為后端服務(wù)器傲霸,nginx 將會把動態(tài)請求轉(zhuǎn)發(fā)給后端服務(wù)器疆瑰,因此我們可以起多個 gunicorn 進(jìn)程,然后讓 nginx 作均衡負(fù)載轉(zhuǎn)發(fā)請求給多個 gunicorn 進(jìn)程從而提升服務(wù)器處理效率與處理能力昙啄。最后穆役,nginx 還可以配置很多安全相關(guān)、認(rèn)證相關(guān)等很多處理跟衅,可以讓你的網(wǎng)站更專注業(yè)務(wù)的編寫孵睬,把一些轉(zhuǎn)發(fā)規(guī)則等其它業(yè)務(wù)無關(guān)的事情交給 nginx 做。
配置好后打開本地瀏覽器伶跷,輸入域名掰读,應(yīng)該就能訪問了秘狞。
gunicorn進(jìn)程控制
啟動Gunicorn之后,會發(fā)現(xiàn)gunicorn啟動的web服務(wù)蹈集,無論怎么使用kill -9 進(jìn)程號都是無法殺死gunicorn烁试,因為是預(yù)先fork,只要一個進(jìn)程死掉就會重新拉起另一個進(jìn)程拢肆,這時候就需要找到父進(jìn)程减响,發(fā)送kill信號。
1郭怪、獲取進(jìn)程樹
pstree -ap|grep gunicorn
2支示、重啟進(jìn)程
kill -HUP 8326(子進(jìn)程PID)
#重啟之后可以看到父進(jìn)程PID是不變的,子進(jìn)程會生成新的PID
3鄙才、關(guān)閉進(jìn)程
kill -9 8137(父進(jìn)程PID)
6.supervisor
如果你需要進(jìn)程一直執(zhí)行颂鸿,若該進(jìn)程因各種原因中斷,也會自動重啟的話攒庵,supervisor是一個很好的選擇嘴纺。 supervisor管理進(jìn)程,是通過fork/exec的方式將這些被管理的進(jìn)程當(dāng)作supervisor的子進(jìn)程來啟動浓冒,所以我們只需要將要管理進(jìn)程的可執(zhí)行文件的路徑添加到supervisor的配置文件中就好了栽渴。此時被管理進(jìn)程被視為supervisor的子進(jìn)程,若該子進(jìn)程異常終端稳懒,則父進(jìn)程可以準(zhǔn)確的獲取子進(jìn)程異常終端的信息闲擦,通過在配置文件中設(shè)置autostart=true,可以實現(xiàn)對異常中斷的子進(jìn)程的自動重啟僚祷。
安裝 supervisor
$ pip install supervisor
$ echo_supervisord_conf > supervisor.conf? # 生成 supervisor 默認(rèn)配置文件
$ vim supervisor.conf??????????? # 修改 supervisor 配置文件佛致,添加 gunicorn 進(jìn)程管理
在項目目錄 supervisor.conf 配置文件底部添加 (注意我的工作路徑是 www/home/blog/ )
[program:blog]
command=/home/www/blog/venv/bin/gunicorn -w4 -b0.0.0.0:8000 wsgi:application? ;supervisor啟動命令
directory=/home/www/blog???????????????????????? ; 項目的文件夾路徑
startsecs=0??????????????????????????????? ; 啟動時間
stopwaitsecs=0????????????????????????????? ; 終止等待時間
autostart=false????????????????????????????? ; 是否自動啟動
autorestart=false???????????????????????????? ; 是否自動重啟
stdout_logfile=/home/www/blog/logs/gunicorn.log????????????? ; log 日志
stderr_logfile=/home/www/blog/logs/gunicorn.err????????????? ; 錯誤日志
使用 supervsior 啟動 gunicorn
$ sudosupervisord -c supervisor.conf
$ sudosupervisorctl start blog
在瀏覽器地址欄輸入配置的地址即可訪問網(wǎng)站。
7. fabric
我們使用fabric實現(xiàn)遠(yuǎn)程操作和部署辙谜。Fabric 是一個 Python 下類似于 Makefiles 的工具俺榆,但是能夠在遠(yuǎn)程服務(wù)器上執(zhí)行命令。
安裝 fabric
pip install fabric
在項目目錄下新建一個fabfile.py文件
importos
fromfabric.api importlocal, env, run, cd, sudo, prefix, settings, execute, task, put
fromfabric.contrib.files importexists
fromcontextlib importcontextmanager
env.hosts =['204.152.201.69']
env.user ='root'
env.password ='****'#密碼
env.group ="root"
DEPLOY_DIR ='/home/www/blog'
VENV_DIR =os.path.join(DEPLOY_DIR, 'venv')
VENV_PATH =os.path.join(VENV_DIR, 'bin/activate')
@contextmanager
defsource_virtualenv():
??with prefix("source {}".format(VENV_PATH)):
????yield
defupdate():
??with cd('/home/www/blog/'):
????sudo('git pull')
defrestart():
??with cd(DEPLOY_DIR):
????ifnotexists(VENV_DIR):
??????run("virtualenv {}".format(VENV_DIR))
????with settings(warn_only=True):
??????with source_virtualenv():
????????run("pip install -r {}/requirements.txt".format(DEPLOY_DIR))
????????with settings(warn_only=True):
??????????stop_result =sudo("supervisorctl -c {}/supervisor.conf stop all".format(DEPLOY_DIR))
??????????ifnotstop_result.failed:
????????????kill_result =sudo("pkill supervisor")
????????????ifnotkill_result:
??????????????sudo("supervisord -c {}/supervisor.conf".format(DEPLOY_DIR))
??????????????sudo("supervisorctl -c {}/supervisor.conf reload".format(DEPLOY_DIR))
??????????????sudo("supervisorctl -c {}/supervisor.conf status".format(DEPLOY_DIR))
??????????????sudo("supervisorctl -c {}/supervisor.conf start all".format(DEPLOY_DIR))
@task
defdeploy():
??execute(update)
??execute(restart)
現(xiàn)在代碼如果更新了装哆,可以直接在本地執(zhí)行遠(yuǎn)程部署了
fab deploy