本文參考以下文章:https://www.yukunweb.com/2017/12/ubuntu-nginx-uwsgi-flask-app/
需要學習的地方
nginx+uwsgi部署flask應用
一 nginx配置:
server {
listen 80;
server_name 192.168.0.114; # 公網IP或域名
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000; #指向uwsgi 所應用的內部地址
uwsgi_param UWSGI_PYHOME /home/project/YuBlog-master/venv; #虛擬環境目錄
uwsgi_param UWSGI_CHDIR /home/project/YuBlog-master/source; # 應用根目錄
uwsgi_param UWSGI_SCRIPT manage:app; # 啟動程序
uwsgi_read_timeout 100;
}
}
二 uwsgi配置:
[uwsgi]
master = true
socket = :5000
wsgi-file = manage.py
callable = app
processes = 4
threads = 2
buffer-size = 32768
說明
1.使用的系統是Cent OS 7.5 64位
2. YuBlog GitHub地址: https://github.com/Blackyukun/YuBlog
一、更新系統
# yum install epel-release
# yum update
# yum install vim wget
二、安裝python3.7
1.安裝依賴包
# yum -y install gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
2.下載並安裝python3.7
# wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
# tar -zxvf Python-3.7.2.tgz
# mkdir /usr/local/python3
# cd Python-3.7.0
# ./configure --prefix=/usr/local/python3
# make && make install
3.設置軟鏈接
# ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3
# ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3
4.檢查安裝是否成功
# python3 -V
# pip3 –V
注:若不設置第三步或者第三步設置未成功,也不礙事,可以直接還是用絕對路徑的方式操作:
/usr/local/python3/bin/python3
/usr/local/python3/bin/pip3
三、獲取應用源碼
# mkdir –p /home/project && cd /home/project
# wget https://github.com/Blackyukun/YuBlog/archive/master.zip
# yum install unzip
# unzip master.zip
得到一個YuBlog-master的文件夾,里面有如下目錄或文件:
certbot # 設置https證書使用
docker-compose.yml # docker使用
mysql # 數據庫文件,可以用來作參考
nginx # nginx文件,可以用來作參考
README.md # 說明
source # 程序源碼
四、配置虛擬環境
說明:不配置虛擬環境也可以,直接使用上述安裝的python3.7環境,不過還是建議使用虛擬環境
1.安裝virtualenv
# /usr/local/python3/bin/pip3 install virtualenv
2.創建虛擬環境
創建在YuBlog-master目錄下,跟source源碼同目錄,也就是在/home/project/YuBlog-master目錄下操作.
需要注意的是,如果直接virtualenv venv命令,創建的將會是Python2的虛擬環境。如果想要創建Python3的環境,需要指定Python3的目錄:
# /usr/local/python3/bin/virtualenv -p /usr/local/python3/bin/python3 venv
如果成功,項目目錄下會生成一個venv目錄,那里就是我們的python3虛擬環境了。接下來激活虛擬環境:
# source venv/bin/activate
激活成功后會出現(venv)
退出虛擬環境命令是:# deactivate
3.安裝依賴包
# /usr/local/python3/bin/pip3 install -r /home/project/YuBlog-master/source/requirements.txt
五、安裝MySQL5.6數據庫
1.下載 MySQL Yum Repository
# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
2.添加 MySQL Yum Repository
# rpm -ivh mysql-community-release-el7-5.noarch.rpm
3.驗證下是否添加成功
# yum repolist enabled | grep "mysql.*-community.*"
4.選擇要啟用 MySQL 版本
查看 MySQL 版本,執行yum repolist all | grep mysql
可以看到 5.5, 5.7 版本是默認禁用的,因為現在最新的穩定版是 5.6
可以通過類似下面的語句來啟動某些版本
yum-config-manager --disable mysql56-community
yum-config-manager --enable mysql57-community-dmr
或者通過修改 /etc/yum.repos.d/mysql-community.repo 文件
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
其中 enabled=0 是指禁用,enabled=1 指啟用。
注意: 任何時候,只能啟用一個版本。
5.通過 Yum 來安裝 MySQL
yum install mysql-community-server
6.設置root密碼
# 啟動 service mysqld start
# 登錄,默認密碼為空
mysql -uroot -p
use mysql;
SET PASSWORD = PASSWORD(' password ');
FLUSH PRIVILEGES;
7.編輯MySQL的配置文件
把數據庫默認的編碼全部改為UTF-8
MySQL的配置文件默認存放在/etc/my.cnf或者/etc/mysql/my.cnf:
vim /etc/mysql/my.cnf
[client]
default-character-set = utf8
[mysqld]
default-storage-engine = INNODB
character-set-server = utf8
collation-server = utf8_general_ci
指令查看編碼是否設置正確。如果看到utf8就表示正確。
show variables like '%char%';
8.創建數據庫
create database mydb;
數據庫操作總結:
用戶名:root,密碼: password,數據庫名:mydb
六、安裝Nginx服務器
1.安裝並啟動nginx
# yum install nginx
默認安裝目錄/etc/nginx/
# service nginx start
2.配置nginx
(1)nginx.conf文件中user nginx;修改成user root;
也就是以root用戶啟動nginx,否則會報錯: 13: Permission denied
(2)nginx.conf文件中server{}塊注釋掉
(3)在conf.d目錄中新建yunblog.conf文件,添加如下內容
server {
listen 80;
server_name 192.168.0.114; # 公網IP或域名
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000; #指向uwsgi 所應用的內部地址
uwsgi_param UWSGI_PYHOME /home/project/YuBlog-master/venv; #虛擬環境目錄
uwsgi_param UWSGI_CHDIR /home/project/YuBlog-master/source; # 應用根目錄
uwsgi_param UWSGI_SCRIPT manage:app; # 啟動程序
uwsgi_read_timeout 100;
}
}
說明:(2)和(3)可以合成一步,也就是說把(2)中的server{}塊內容換成(3)中的內容.或者參考/home/project/YuBlog-master/nginx目錄下的nginx.conf文件
3.重啟nginx
# service nginx restart
七、安裝uWSGI
1.在虛擬環境中安裝uwsgi
# /usr/local/python3/bin/pip3 install uwsgi
2.配置uwsgi
在項目的根目錄下,創建配置文件config.ini,
篇日志如下內容:
[uwsgi]
master = true
socket = :5000 #跟 nginx配置文件中的端口號保持一致
wsgi-file = manage.py # 主程序文件
callable = app # 應用
processes = 4
threads = 2
buffer-size = 32768
八、項目配置
1、2、3為必須配置的,其余保持默認即可
1. 配置數據庫信息
博客運行前需要在config.py中配置必須信息。YuBlog 采用mysql存儲,redis做部分緩存,需配置數據庫信息。
mysql
的配置需根據使用場景選擇配置,
開發場景配置DevelopmentConfig
類中的SQLALCHEMY_DATABASE_URI
的信息。
生產環境的配置在ProductionConfig
類的SQLALCHEMY_DATABASE_URI
信息。
其中默認的root:password
為user
:password
,
@localhost:3306/db
為@<host>:<port>/<db-name>
。
2.
配置redis信息
安裝redis: yum install redis
啟動redis: service redis start
redis的配置為:
# 配置類型,可選`simple`不使用 redis 數據庫(不推薦)
CACHE_TYPE = 'redis'
CACHE_REDIS_HOST = '127.0.0.1'
CACHE_REDIS_PORT = 6379
CACHE_REDIS_DB = os.getenv('CACHE_REDIS_DB') or ''
CHCHE_REDIS_PASSWORD = os.getenv('CHCHE_REDIS_PASSWORD') or ''
其中私密信息建議使用環境變量的形式配置,如CHCHE_REDIS_PASSWORD
os.getenv()表示是從.env中獲取配置信息
3. .env文件內容
MYSQL_PASSWORD= password
ADMIN_PASSWORD=password # 管理員登陸密碼
MAIL_USERNAME=example@email.com # 發送郵件郵箱
MAIL_PASSWORD=password # 發送郵件郵箱的第三方客戶端登陸密碼
ADMIN_MAIL=example@email.com # 接受通知郵件郵箱
QN_ACCESS_KEY='' # 如使用七牛圖床,需要配置,否則默認空就行
QN_SECRET_KEY=''
4. 防止csrf攻擊配置
CSRF_ENABLED = True
# 密鑰
SECRET_KEY = 'you-guess'
5. 分頁條數配置
# 每頁顯示文章條數
POSTS_PER_PAGE = 10
# 管理文章頁,每頁顯示條數
ADMIN_POSTS_PER_PAGE = 20
# 歸檔頁文章條數
ACHIVES_POSTS_PER_PAGE = 20
# 搜索結果頁每頁條數
SEARCH_POSTS_PER_PAGE = 15
# 文章評論分頁,每頁條數
COMMENTS_PER_PAGE = 10
# 管理評論,每頁條數
ADMIN_COMMENTS_PER_PAGE = 50
6. 管理員初始設置
# 管理員姓名
ADMIN_NAME = 'kyu'
# 管理員登錄信息
ADMIN_LOGIN_NAME = 'login-name'
# 登錄密碼
ADMIN_PASSWORD = os.getenv('ADMIN_PASSWORD') or 'password'
# 博客名
SITE_NAME = '意外'
# 博客標題
SITE_TITLE = '我的博客'
# 管理員簡介
ADMIN_PROFILE = '克制力,執行力'
同樣的ADMIN_PASSWORD
配置建議使用環境變量,初始設置除了登錄名和登錄密碼,可以直接選擇默認,可以在管理頁面修改。
7. 站點配置
rss 配置
# 站點協議
WEB_PROTOCOL = 'http/https'
# 站點域名
WEB_URL = 'domain name'
# 站點創建時間
WEB_START_TIME = '2018-08-18'
# 顯示條數
RSS_COUNTS = 10
# 發送郵件用戶登錄
MAIL_USERNAME = os.getenv('MAIL_USERNAME')
# 客戶端登錄密碼非正常登錄密碼
MAIL_PASSWORD = os.getenv('MAIL_PASSWORD')
MAIL_SERVER = os.getenv('MAIL_SERVER') or 'smtp.qq.com'
MAIL_PORT = os.getenv('MAIL_PORT') or '465'
ADMIN_MAIL_SUBJECT_PREFIX = 'blog'
ADMIN_MAIL_SENDER = 'admin.com'
# 接收郵件通知的郵箱
ADMIN_MAIL = os.getenv('ADMIN_MAIL')
# 站點搜索的最小字節
WHOOSHEE_MIN_STRING_LEN = 1
# 專題保密文章的密碼,建議設置環境變量
ARTICLE_PASSWORD = os.getenv('ARTICLE_PASSWORD') or 'password'
8. 七牛圖床配置
默認不開啟。如需使用可將NEED_PIC_BED
配置為True
。
# 七牛雲存儲配置
NEED_PIC_BED = False
QN_ACCESS_KEY = os.getenv('QN_ACCESS_KEY') or ''
QN_SECRET_KEY = os.getenv('QN_SECRET_KEY') or ''
# 七牛空間名
QN_PIC_BUCKET = 'bucket-name'
# 七牛外鏈域名
QN_PIC_DOMAIN = 'domain-url'
九、程序運行相關
1. 配置環境變量為生產環境
windows
配置: set CONFIG=production
linux配置: export CONFIG=production
2.
遷移數據庫等信息
使用前確認是否開啟了mysql,配置了相關信息
- 創建遷移倉庫:python manage.py db init;
- 創建遷移腳本:python manage.py db migrate -m "v1.0";
- 更新倉庫:python manage.py db upgrade;
- 創建管理員信息:python manage.py add_admin;
十、啟動uwsgi
1.啟動uwsgi
# uwsgi config.ini (
在虛擬環境目錄中執行)
報錯:
no app loaded. going in full dynamic mode
配置plugin = python或者啟動uwsgi命令:uwsgi config.ini --plugin python
2.訪問網站(80端口放行)
十一、使用說明
后台登錄
賬號和密碼需要在配置文件中查看
編輯文章
后文對網站的編輯操作,只允許有管理員權限的用戶操作。
YuBlog
支持markdown
語法,上傳圖片可使用七牛圖床進行上傳獲取外鏈。填寫說明:
分類:技術 # 限制只能寫一個分類
標簽:docker,nginx # 標簽不限制個數,每個標簽之間使用英文的逗號隔開
鏈接:nginx-and-docker # 文章的URL,自己可以隨意指定,建議有些意義
日期:2018-08-18 # 年月日間需使用-連接
標題:nginx和docker # 文章標題
可以選擇保存草稿,待下次編輯,也可以直接發布,當然后續更改也很方便。
管理文章
可以對所有發布過的文章進行更新或者刪除操作,刪除需進一步確認,以防誤刪。
審核評論
為了防止垃圾評論污染,用戶的評論一律需要自己審核通過還是刪除。
管理鏈接
博客支持添加友情鏈接和社交鏈接,他們展示在不同的地方。不要搞錯了:
添加專題
博客支持系列專題功能,專欄一般是一類文章的聚合,比如系列教程或者日記啥的,文章可以自行選擇加密或者不加密。由於之前的偷懶,文章密碼是設置在環境變量的,未來會改進。
側欄插件
博客支持自定義的側欄box
插件:
如果想要保持側欄固定頂部,需要勾選廣告選項。插件支持原生的html,css,js語法。但要保持寬度不得超過父元素,建議不超過230px。
<a href="https://www.yukunweb.com/static/upload/wenwen.png" target="_blank">
<img src="https://www.yukunweb.com/static/upload/wenwen.png" alt="wenwen" style="width:230px;">
</a>
更多的玩法有待考慮。
上傳文件
由於是個人使用,沒有對上傳的文件做進一步的過濾操作。建議大家不要隨意上傳.php
、.sh
、.py
的文件。上傳的文件位於靜態目錄:app/static/upload
下,可以使用http://<server-name>/static/upload/<filename>
訪問。
七牛圖床
如需使用七牛圖床,需要配置好七牛圖床的信息。包括個人的AccessKey/SecretKey
:
默認的外鏈域名為:
空間名是個人創建的倉庫名。
七牛圖床主要是為了更方便的管理上傳於七牛雲的圖片,目前支持上傳,更名,刪除等操作。