Nginx + Gunicorn 伺服器配置部署 Django

娃哈哈店長發表於2019-12-26

Nginx + Gunicorn 伺服器配置 Django

  • Django==2.0.3
  • Python==3.6

Nginx + Gunicorn 伺服器配置 Django

Django==2.0.3
Python==3.6

專案原始碼:

克隆專案:

~# git clone https://github.com/Freen247/django_blog.git
~# pwd
/home/django_blog

建立虛擬環境

虛擬環境是個好東西,我選擇的是在django專案中建立,方便處理。

~# cd .\django_blog\
~# virtualenv django_env
~# source /django_env/bin/activate
~# pip install -r requirement.txt

NGINX

嘗試執行django專案:python manage.py runserver
成功!
注意ALLOWED_HOSTS的值:[‘127.0.0.1’, ‘localhost’, ‘域名’]或者[*]

安裝配置 Nginx

安裝nginx:

  • 安裝nginx依賴工具PCRE,讓nginx有rewrite功能:

    1. 安裝PCRE依賴工具yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
    2. cd /usr/local/src/ && wget http://downloads.sourceforge.net/project/p... && tar zxvf pcre-8.35.tar.gz && cd pcre-8.35 &&./configure && make && make install
  • 下載nginx並安裝:cd /usr/local/src/ &&wget http://nginx.org/download/nginx-1.6.2.tar.gz && tar zxvf nginx-1.6.2.tar.gz && cd nginx-1.6.2 &&
    ./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35&& make && make install

  • 在/usr/local/webserver/nginx/目錄x下就是我們安裝好的nginx了。
    修改一下/usr/local/webserver/nginx/conf/nginx.conf 配置檔案,不要使用預設的那個:

[root@VM_101_141_centos ~]# cat /usr/local/webserver/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    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 ;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
        upstream app_server {

    # for UNIX domain socket setups
    server unix:/home/django_blog/gunicorn.sock fail_timeout=0;

    }
    server {
        charset utf-8;
        listen       80;
        server_name  bpywithacoin.cn;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
         # static 和 media 的地址
        location /static {#注意!!!:static後面不能有/斜槓,否則會導致靜態檔案404
            alias /home/django_blog/static;
        }
        location /media {
            alias /home/django_blog/media;
        }

        location / {
           proxy_pass http://app_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}
}

連線 Nginx 配置

Systemd服務檔案以.service結尾,比如現在要建立nginx為開機啟動,如果用yum install命令安裝的,yum命令會自動建立nginx.service檔案,直接用命令

systemcel enable nginx.service

設定開機啟動即可。
在這裡我是用原始碼編譯安裝的,所以要手動建立nginx.service服務檔案。
開機沒有登陸情況下就能執行的程式,存在系統服務(system)裡,即:
/lib/systemd/system/
在系統服務目錄建立nginx.service
vi /lib/systemd/system/nginx.service

[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/webserver/nginx/sbin/nginx
ExecReload=/usr/local/webserver/nginx/sbin/nginxnginx -s reload
ExecStop=/usr/local/webserver/nginx/sbin/nginxnginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

有的的服務的目錄實在etc/systemd/system/,,如果失敗了k可以再試一下

上面的配置檢查好之後,使用下面的命令來將這個配置跟 Nginx 建立連線,使用命令:
ln -s /usr/local/nginx/conf/nginx nginx安裝dir/nginx/sites-enabled
測試是否配置成功:
/usr/local/webserver/nginx/sbin/nginx -t

沒報錯的話,重啟一下 Nginx:systemctl restart nginx

好了,重啟 Nginx 之後可以登入自己配置的域名,看看自己的專案是不是已經成功的執行了呢!

gunicorn

安裝和配置

安裝: pip install gunicorn
嘗試用gunicorn開啟我們的專案:
gunicorn django_blog.wsgi:application --bind 0.0.0.0:8000

[2019-06-30 14:26:04 +0800] [19524] [INFO] Starting gunicorn 19.9.0
[2019-06-30 14:26:04 +0800] [19524] [INFO] Listening at: http://0.0.0.0:8000 (19524)
[2019-06-30 14:26:04 +0800] [19524] [INFO] Using worker: sync
[2019-06-30 14:26:04 +0800] [19527] [INFO] Booting worker with pid: 1952

返回結果成功!這樣我們就可以透過gunicorn開啟我們的專案。
編寫gunicorn_start.sh指令碼,chmod +x gunicorn_start.sh便於nohup工具後臺持續執行.

[root@VM_101_141_centos home]# cat gunicorn_start.sh
#!/bin/bash
NAME='django_blog' #應用的名稱i
DJANGODIR=/home/django_blog #django專案的目錄
SOCKFILE=/home/django_blog/gunicorn.sock #使用這個sock來通訊
USER=root #執行此應用的使用者
GROUP=root #執行此應用的組
NUM_WORKERS=3 #gunicorn使用的工作程式數
DJANGO_SETTINGS_MODULE=django_blog.settings #django的配置檔案
DJANGO_WSGI_MODULE=django_blog.wsgi #wsgi模組
LOG_DIR=/home/logs #日誌目錄

echo "starting $NAME as `whoami`"

#啟用python虛擬執行環境
cd $DJANGODIR
source /envblog/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

#如果gunicorn.sock所在目錄不存在則建立
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

#啟動Django

exec gunicorn ${DJANGO_WSGI_MODULE}:application \
    --name $NAME \
    --workers $NUM_WORKERS \
    --user=$USER --group=$GROUP \
    --log-level=debug \
    --bind=unix:$SOCKFILE \
    --access-logfile=${LOG_DIR}/gunicorn_access.log

有一個日誌資料夾和nohup日誌檔案需要建立:

[root@VM_101_141_centos home]# ls
django_blog  gunicorn_start.sh  logs  nohup.log

LOG_DIR=/home/logs #日誌目錄 和 nohup.log #日誌檔案

啟動配置檔案

檔案配置完成之後,使用nohup的命令啟動服務:
後臺持續執行:nohup ./gunicorn_start.sh > nohup.log
成功!:

(envblog) [root@VM_101_141_centos home]# nohup ./gunicorn_start.sh > nohup.log
nohup: ignoring input and redirecting stderr to stdout

可能會發現這時候終端無法輸入指令,直接退出就好。

維護、更改檔案之後後續操作

之後的專案維護中:

  • 如果更改了 gunicorn 的sh檔案,需要重新使用nohup命令啟動。

  • 如果修改了 Nginx 的配置檔案,先測試以配置是否成功/usr/local/webserver/nginx/sbin/nginx -t再重啟systemctl restart nginx

  • 如果呼叫了新的django類似jet、xadmin、django-mdeditor包新增元件當需要另外呼叫js\css樣式的時候,需要執行python manage.py collectstatic

-如果更改models更改註冊的模型,需要增刪改資料庫等,需要執行
python manage.py makemigrationspython manage.py migrate


三、文章給models.Category新增圖片

語法:
img = models.ImageField(verbose_name='類別圖片', upload_to='category_img', default="/category_img/default.png")

  • 注意:
    更改models之後需要執行python manage.py makemigrationspython manage.py migrate
    這裡必須設定default值否則會報錯、
    upload_to的值是MEDIA_URL目錄的相對目錄、
    default的值是STATICFILES_DIRS目錄的相對目錄
    呼叫category.img會返回圖片的名稱:default.png,呼叫category.img.url回訪會圖片的相對STATICFILES_DIRS的相對路徑
    所以前端可以用<a class="card-featured-img" style='background-image: url("{{ post.category.img.url }}");' ></a>來顯示圖片。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
文章!!首發於我的部落格Stray_Camel(^U^)ノ~YO

相關文章