CentOS部署Django+Gunicorn+Supervisor+Nginx
伺服器如果是新做的一個系統,先升級一下伺服器的環境,yum和pip
yum update pip install --upgrade pip
先安裝Python3
ofollow,noindex">centos安裝python3
然後用pyvenv做隔離,因為我的伺服器上跑的東西不多,先用這個對付著,伺服器東西跑的多的,最好還是用Docker隔離比較徹底
到專案目錄後建立虛擬環境venv並激活
cd /var/www/django_web/ python3 -m venv venv cd venv/bin source activate
然後在開發環境打包一下需要的依賴包
pip3 freeze > requirements.txt 或 python3 -m pip freeze > requirements.txt
把這個requirements.txt上傳到伺服器上,再按這個包安裝環境
python3 -m pip install -r requirements.txt
安裝的時候,裝到mysqlclient這個庫的時候出錯了,OSError: mysql_config not found
網上找了一下mysql_config要下面這些依賴,安裝上,就可以了
yum install mysql-devel gcc gcc-devel python-devel
ftp上傳專案檔案,然後生成資料庫,django官方推薦migrations放到版本控制中,所以migrations檔案我一併上傳到伺服器,不需要再make
python3 manage.py migrate
建立超級管理員帳號
python3 manage.py createsuperuser
執行runserver試一下
python3 manage.py runserver 0.0.0.0:8000
如果訪問不了,把防火牆8000埠開啟一下再嘗試
firewall-cmd --zone=public --add-port=8000/tcp firewall-cmd --reload
沒問題的話開始部署gunicorn
之前的開發包裡我已經安裝了gunicorn,如果沒安裝就在伺服器的虛擬環境裡pip安裝一下
把gunicorn新增到django的settings.py裡的INSTALLED_APPS裡
接著可以直接執行
gunicorn django_web.wsgi:application -b 0.0.0.0:8000
如果沒問題,可以接下去配置一個配置檔案,方便以後設定
guni.conf.py
import multiprocessing bind = '0.0.0.0:8000' #監聽埠 workers = 2 #負責處理請求的執行緒數,一般設定成:伺服器CPU個數 + 1 #worker_class = "gevent" #使用的網路模型,預設sync,如果要效能好點就用gevent,我的專案暫時不用,註釋掉 worker_connections = 200 #同時最大連線數 #daemon = True #是否後臺執行,因為使用了supervisor,gunicorn不需要執行daemon模式 pidfile = 'gunicorn.pid' #pid檔案 proc_name = 'guni_web' #程序名稱 reload = True #當代碼有更新的話自動重啟workers,有點類似於除錯模式 errorlog = "/var/www/django_web/log/guni_error.log" #錯誤日誌# accesslog = "/var/www/django_web/log/guni_access.log" #訪問日誌 #loglevel = 'debug'
用 -c 引數執行gunicorn
gunicorn -c guni.conf.py django_web.wsgi:application #django_web.wsgi為django_web目錄下的wsgi.py檔案(由django生成)
先退出虛擬環境再安裝,否則這個是裝到虛擬環境下的
deactivate pip install supervisor
配置檔案,先建立兩個目錄
mkdir /etc/supervisor mkdir /etc/supervisor/conf.d
建立配置檔案:/etc/supervisor/supervisord.conf
[unix_http_server] file=/tmp/supervisor.sock ; the path to the socket file chmod=0700 [supervisord] logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log logfile_maxbytes=10MB ; max main logfile bytes b4 rotation; default 50MB logfile_backups=1 ; # of main logfile backups; 0 means none, default 10 loglevel=info ; log level; default info; others: debug,warn,trace pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid nodaemon=false ; start in foreground if true; default false minfds=1024 ; min. avail startup file descriptors; default 1024 minprocs=200 ; min. avail process descriptors;default 200 [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket [include] files = /etc/supervisor/conf.d/*.conf
建立子配置檔案 /etc/supervisor/conf.d/webserver.conf
[program:webserver] directory = /var/www/django_web command = /var/www/django_web/venv/bin/gunicorn -c /var/www/django_web/guni.conf.py lodgenotice.wsgi:application stdout_logfile = /var/www/django_web/log/supervisor.log autostart = true startsecs = 5 autorestart = true startretries = 3 user = root redirect_stderr = true stdout_logfile_maxbytes = 10MB stdout_logfile_backups = 1
用-c引數指定配置檔案來執行supervisor
supervisord -c /etc/supervisor/supervisord.conf
啟動後可以用supervisorctl來管理
# 停止某一個程序,program_name 為 [program:x] 裡的 x supervisorctl stop program_name # 啟動某個程序 supervisorctl start program_name # 重啟某個程序 supervisorctl restart program_name # 結束所有屬於名為 groupworker 這個分組的程序 (start,restart 同理) supervisorctl stop groupworker: # 結束 groupwor:name1 這個程序 (start,restart 同理) supervisorctl stop groupworker:name1 # 停止全部程序,注:start、restart、stop 都不會載入最新的配置檔案 supervisorctl stop all # 載入最新的配置檔案,停止原有程序並按新的配置啟動、管理所有程序 supervisorctl reload # 根據最新的配置檔案,啟動新配置或有改動的程序,配置沒有改動的程序不會受影響而重啟 supervisorctl update
建立一個supervisor服務,這樣伺服器重啟後會自動啟動
建立檔案/usr/lib/systemd/system/supervisord.service
# dservice for systemd (CentOS 7.0+) # by ET-CS (https://github.com/ET-CS) [Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
開啟服務
systemctl enable supervisord
檢查一下看看是否設定成功
systemctl is-enabled supervisord
先把Django專案的靜態檔案收集到一個地方
修改settings.py ,這個路徑就是我們要收集所有靜態檔案的路徑,到時候加到nginx
STATIC_ROOT=‘/var/www/django_web/static/’
在虛擬環境下執行
python manage.py collectstatic
安裝Nginx
yum install nginx -y
配置檔案/etc/nginx/nginx.conf,修改server欄位的內容如下(不要把下面的直接做一個檔案,要在原檔案上修改)
server{ listen 80;監聽的埠 server_name 127.0.0.1; server_name your_www; #當請求這些server name的時候,nginx才會做反向代理,0.0.0.0是指全部 location / { proxy_intercept_errors on; proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # location 顧名思義,定位,就是當訪問 / 的時候,nginx會將請求轉給本地的8080埠,而後面的設定都是一些基本的配置,可以直接用 location /static { alias /var/www/django_web/static; } # 這個就是配置靜態檔案的地方,要用絕對地址,你在開發的時候建議每個app的靜態檔案都用多了一層app_name的資料夾來包住。 }
配置好後,先檢查一下對不對,如果沒有問題就可以運行了
nginx -t
執行nginx的命令很簡單,直接命令列輸入nginx即可
nginx -s reload|reopen|stop|quit#重新載入配置|重啟|停止|退出 nginx
如果有防火牆,開啟伺服器80埠,加上--permanent就是永久有效,不加重啟後會失效
firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload
阿里雲還要開一個安全組的80埠
這樣基本就部署完了,用瀏覽器開啟就可以訪問到你的網頁了。
如果怕nginx會執行中崩潰,或者是想重啟後自動開啟,直接加個檔案到supervisor裡面就可以自動監控了
建立子配置檔案 /etc/supervisor/conf.d/nginx.conf
[program:nginx] command = /usr/sbin/nginx -g 'daemon off;' autostart=true startsecs=5 autorestart=true user = root stdout_logfile=/var/www/django_web/log/nginx_stdout.log stdout_logfile_maxbytes=10MB stderr_logfile=/var/www/django_web/log/nginx_stderr.log stderr_logfile_maxbytes=10MB