mysql+uwsgi+django+nginx部署記錄
- 注:這是在運維人員安裝完python, nginx之後的事
第一步安裝uwsgi 和 mysql驅動
說明: 用的是Python3, 安裝 uwsgi 的時候 會需要安裝 python3-devel ,
如果安裝失敗 可以安裝一下 開發包:
yum groupinstall "Development Tools"
sudo yum install python3-devel
安裝uwsgi 就直接用pip 安裝就可以了(pip 已經新增到了環境變數當中)
pip install -U uwsgi
pip install http://projects.unbit.it /downloads/uwsgi-lts.tar.gz
也可以通過 wget 的方法安裝
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gz
cd uwsgi*
python uwsgiconfig.py --build
配置、修改許可權
~$ cp uwsgi /usr/bin/
~$ chmod a+x /usr/bin/uwsgi
~$ groupadd -g 51 uwsgi
~$ useradd -g 51 uwsgi
安裝好了uwsgi之後了, 由於打算用mysql 必需要安裝 python的mysql驅動
注: django的官網上說了, 使用python3的話需要使用mysql-client而不是原來pyMySQLDb了
先安裝sudo yum install python3-devel 由於前面安裝uswgi時已經安裝,因此此處無需重複執行
安裝mysql的開發包
sudo yum install mysql-devel
最後使用
pip install mysqlclient
完成 在安裝過程中可能會遇到一個問題
uwsgi undefined reference to `pcre_free_study’
解決辦法 是直接 移除掉prce-devel包
sudo yum remove prce-devel
安裝完這兩個之後了, 接著要配置 uwsgi和nginx
第二步配置 uwsgi和nginx
uwsgi 使用 ini檔案配置方式
[uwsgi]
socket = /home/fenglonghui/tools.sock
chdir = /var/tester
wsgi-file = tools/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
daemonize = /var/log/uwsgi/tools.log
master = true
配置好uswgi之後了,按照官網文件弄個簡單的django app測試一下
接下來是配置 nginx 這個上面的連結中也給出了配置說明
user root;
worker_processes 4;
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
upstream django {
server unix:///home/fenglonghui/tools.sock;
}
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
client_header_buffer_size 128k;
server {
listen 80;
server_name youserver.domain.name;
charset utf-8;
client_max_body_size 10m;
access_log logs/host.access.log main;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ^~ /m/ {
alias /home/fenglonghui/media/; # your Django project's media files - amend as required
}
location ^~ /s/ {
alias /home/fenglonghui/static/; # your Django project's static files - amend as required
}
location / {
uwsgi_pass django;
include uwsgi_params;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
}
}
- 注: 在配置這些日誌檔案的路徑的時候, 確保這些目錄路徑是有效的否則會報錯 ,可以檢視 nginx安裝目錄下面的log資料夾下的 error.log來發現nginx的問題, 同理uwsgi配置的日誌路徑也是如此
在整個都配置好了,之後我們去外網試試能訪問配置好的網站 ,
遇到個問題,當網站訪問一次之後,第二次訪問就訪問不到了
解決這個問題用排除法, 檢視日誌資訊,但是最後日誌資訊裡面是沒有問題的, 而你測試程式前面也測試過了, 也沒有問題, 那麼可能的原因是運維那邊的問題, 因為在訪問網頁的時候提示下面這個錯誤
錯誤資訊-101:連線已被重置
需要排除是否有程式碼錯誤, 而這種錯誤顯然不是程式碼的錯誤,因為程式碼錯誤一般是500, 404之類的
- 最終通過運維人員排查,發現是負載均衡F5沒有開通的原因,才會造成每次重啟下 uwsgi就又能訪問了
最終錯誤原因:
Offline (Enabled) - The children pool member(s) are down
由於你非正式服務 。 所以那臺負載均衡裝置認為你服務有問題。就拒絕給你轉發請求。
所以你外網訪問不到 內網可以請求
在這些問題解決之後,我們還需要將mysql與model進行同步
python manage.py makemigrations ,
python manage.py migrate
在進行遷移資料庫的時候可能會出現問題,這時多執行幾次命令試一試,可能第一次是在編譯python程式碼的問題,有的時候會出現問題