1. 程式人生 > >mysql+uwsgi+django+nginx部署記錄

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程式碼的問題,有的時候會出現問題