基於Nginx和uwsgi搭建Django部署上線環境
環境:阿里雲 ECS CentOS 7.2 64位
安裝:
- python3
- python虛擬環境
- django
- uwsgi
- nginx
安裝Python3
不動現有的Python2環境安裝Python3
下載Python3
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
解壓Python3
tar -zxvf Python-3.6.1.tgz
進入目錄
cd Python-3.6.1
安裝到指定目錄(本次指定路徑/usr/local/python3
)
新建資料夾
mkdir -p /usr/local/python3
配置安裝路徑
./configure --prefix=/usr/local/python3
編譯
make
安裝
make install
環境配置,讓python3命令即輸即用
建立python3的軟鏈
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
並將/usr/local/python3/bin
加入PATH
:
vim ~/.bash_profile
修改完畢,執行命令,讓修改生效:
source ~/.bash_profile
檢查Python3是否安裝成功:
python3 -V
安裝Python3虛擬環境
為啥要安裝虛擬環境:
在一個 Python 環境下開發時間越久、安裝依賴越多,就越容易出現依賴包衝突的問題。為了解決這個問題,開發者們開發出了 virtualenv,可以搭建虛擬且獨立的 Python 環境。這樣就可以使每個專案環境與其他專案獨立開來,保持環境的乾淨,解決包衝突問題。
安裝 virtualenv,執行命令即可:
pip3 install virtualenv
建立專案的虛擬環境:
virtualenv venv(虛擬環境名稱)
執行後,在本地會生成一個與虛擬環境同名的資料夾,包含 Python 可執行檔案和 pip 庫的拷貝,可用於安裝其他包。預設情況下,虛擬環境中不會包含也無法使用系統環境的global site-packages。比如系統環境裡安裝了 requests 模組,在虛擬環境裡import requests會提示ImportError。如果想使用系統環境的第三方軟體包,可以在建立虛擬環境時使用引數–system-site-packages
。
可以自己指定虛擬環境所使用的 Python 版本,前提系統中已經安裝了該版本:
virtualenv -p /usr/bin/python2.7 venv
使用虛擬環境
進入虛擬環境目錄,啟動虛擬環境。
source venv/bin/activate
看到(venv)
表示已經進入虛擬環境。
退出虛擬環境:
deactivate
如果專案開發完成後想刪除虛擬環境,直接刪除虛擬環境目錄即可。
安裝Django
在虛擬環境中執行命令即可:
pip install django
本次重點介紹Django如何上線部署,Django相關知識不做具體介紹。
新建Django專案:
django-admin startproject 專案名
安裝uwsgi
在虛擬環境中執行命令即可:
pip install uwsgi
現在重點來啦,上面那麼多都只是基本的環境配置。下面的是知識點,部分也是難點,筆者在這個地方被困了很久,所以一定要弄得時候寫個博文記錄下來。
配置uwsgi
當前目錄下建立test.py檔案
def application(env, start_response):
start_response(`200 OK`, [(`Content-Type`,`text/html`)])
return "Hello World" #國際慣例,helloworld
執行程式碼:
uwsgi --http :9111 --wsgi-file test.py
報錯:
-bash: uwsgi: command not found
遇到這個情況怎麼辦?肯定不能放棄,幹就行啦。
通過pip安裝的元件,執行命令檔案在python源目錄下的bin目錄中,所以解決方案:
執行命令:
ln -s /your-python-dir/bin/* /usr/bin/*
*代表你你需要新增的執行命令uwsgi,故障排除,然後繼續執行:
uwsgi --http 0:8000 --wsgi-file test.py
成功後提示:
*** Starting uWSGI 2.0.17.1 (64bit) on [Fri Nov 23 12:12:30 2018] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-28) on 22 November 2018 09:21:34
os: Linux-3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017
nodename: iZhp31ku43vn2fbp1dk355Z
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /home/ruanfumin
detected binary path: /usr/local/python3/bin/uwsgi
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 1880
your memory page size is 4096 bytes
detected max file descriptor number: 65535
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on 0:8000 fd 4
spawned uWSGI http 1 (pid: 11058)
uwsgi socket 0 bound to TCP address 127.0.0.1:34451 (port auto-assigned) fd 3
Python version: 3.6.1 (default, Nov 22 2018, 17:05:27) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0xaa2120
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72920 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint=``) ready in 0 seconds on interpreter 0xaa2120 pid: 11057 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 11057, cores: 1)
訪問一下IP地址,本機就是127.0.0.1:8000
,伺服器就是伺服器ip:8000
:
瀏覽器看到:Hello World
終端會提示:
[pid: 11057|app: 0|req: 1/1] 183.206.12.47 () {42 vars in 829 bytes} [Fri Nov 23 12:13:17 2018] GET / => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)
表明uwsgi配置ok,我們繼續
直接使用Django跑一下專案,看能不能執行成功,由於Django是在阿里雲伺服器上,所以專案設定檔案settings.py需要修改一下。
ALLOWED_HOSTS = [`*`]
醬紫就可以訪問了。我們跑一下試試:
python manage.py runserver 0:8000
使用Uwsgi 跑 django專案
在專案(新建的測試專案testproject
)路徑下,執行:
uwsgi --http 0:8000 --module testproject.wsgi
解釋:--http 0:8000
攜帶這個參數列明可以http訪問,埠號是8000。--module testproject.wsgi
指定Django專案的wsgi檔案。
參考Django官方文件:
uwsgi --chdir=/path/to/your/project
--module=mysite.wsgi:application
--env DJANGO_SETTINGS_MODULE=mysite.settings
--master --pidfile=/tmp/project-master.pid
--socket=127.0.0.1:49152 # can also be a file
--processes=5 # number of worker processes
--uid=1000 --gid=2000 # if root, uwsgi can drop privileges
--harakiri=20 # respawn processes taking more than 20 seconds
--max-requests=5000 # respawn processes after serving 5000 requests
--vacuum # clear environment on exit
--home=/path/to/virtual/env # optional path to a virtualenv
--daemonize=/var/log/uwsgi/yourproject.log # background the process
再次訪問:http://39.104.91.28:8000/
發現還是成功辣,真好。
在專案目錄下新建uwsgi.ini
檔案,可以參考官方文件:
[uwsgi]
#chidr用於指定自己的網站根目錄(自行更改)
chdir = /var/www/testproject
#module指定網站中APP的檔案(自行更改)
module = testproject.wsgi
#home用於指定python的虛擬環境,即我們最初建立的虛擬環境位置(自行更改)
home = /var/www/venv
#master不用更改
master = true
#socket用於指定埠號,可以不更改
socket = :8000
#以下兩個可以不用更改
chmod-socket = 666
檔案裡我們指定socket,讓Nginx伺服器通過這個socket處理uwsgi。
Nginx安裝:
這個不細說了,直接yum命令就好:
yum install nginx
Nginx配置修改
進入Nginx配置目錄,在/etc/nginx/
下:
我們修改nginx.conf
檔案:
upstream django_test { #加上_test,因為和原來的衝突了,這裡備註下
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we`ll use this first) 類似uwsgi埠
}
server {
listen 80;
server_name ruanfumin;
location / {
include uwsgi_params;
uwsgi_pass django_test;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location /static {
alias /var/www/first/static; # 載入你的靜態檔案
}
}
修改完,儲存,重啟Nginx伺服器,然後再到Django專案目錄下啟動uwsgi服務:
uwsgi --ini uwsgi.ini
瀏覽器輸入url訪問:39.104.91.28:80
當然這次是80埠訪問了,因為Nginx我們設定的嘛,你可以隨意修改。
注:
相關文章
- 基於nginx和uWSGI在Ubuntu上部署DjangoNginxUbuntuDjango
- CentOS7---部署Nginx+uwsgi+Django+python3環境CentOSNginxDjangoPython
- centos+nginx+uwsgi部署django專案上線詳解CentOSNginxDjango
- 使用 uWSGI 和 Nginx 部署 Django 專案NginxDjango
- 多專案上線Nginx+Django+uwsgiNginxDjango
- 基於Ubuntu16.04的django+uwsgi+nginx安裝部署UbuntuDjangoNginx
- Python3 flask nginx uwsgi 環境搭建PythonFlaskNginx
- Docker 部署 Django+Uwsgi+Nginx+MySQL+VueDockerDjangoNginxMySqlVue
- 使用nginx+uwsgi部署Django專案NginxDjango
- Nginx+uWSGI+Django部署web伺服器NginxDjangoWeb伺服器
- Django + Uwsgi + Nginx 實現生產環境部署DjangoNginx
- 【Python】Nginx+uwsgi+Django部署程式碼PythonNginxDjango
- Django-Nginx-uwsgiDjangoNginx
- centos8-django專案部署 nginx+uwsgiCentOSDjangoNginx
- 阿里雲部署Django專案(nginx+uWSGI)阿里DjangoNginx
- CentOS7 + Python3 + Django(rest_framework) + MariaDB + nginx + uwsgi 部署 API 開發環境CentOSPythonDjangoRESTFrameworkNginxAPI開發環境
- Django+uWSGI+Nginx配置DjangoNginx
- Django Mezzanine uwsgi nginx 配置DjangoNginx
- Nginx+Django+uWSGI部署伺服器詳細解析NginxDjango伺服器
- Linux部署Django (Nginx + uwsgi + Python3 + Django)的過程LinuxDjangoNginxPython
- 基於Docker搭建PHP+Nginx+MySQL開發環境DockerPHPNginxMySql開發環境
- windows環境下Django環境搭建WindowsDjango
- Django筆記四十四之Nginx+uWSGI部署Django以及Nginx負載均衡操作Django筆記Nginx負載
- Linux 上部署 docker,基於 docker 搭建 lnmp 環境LinuxDockerLNMP
- django專案在uwsgi+nginx上部署遇到的坑DjangoNginx
- 用uWSGI和Nginx部署Flask專案NginxFlask
- 使用uwsgi和Nginx部署flask應用NginxFlask
- Django上線部署Django
- Django框架環境搭建Django框架
- Nginx+uwsgi+Django 的web應用環境部署-完整記錄NginxDjangoWeb
- 基於Docker搭建LNMP環境DockerLNMP
- 在 Ubuntu 上搭建 nginx+PHP+Laravel 環境UbuntuNginxPHPLaravel
- Django之Ubuntu環境搭建DjangoUbuntu
- Django生產環境搭建Django
- Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web伺服器UbuntuDjangoNginxMySqlPythonWeb伺服器
- 一學就會的django專案伺服器部署nginx-uwsgi-django/buildDjango伺服器NginxUI
- Windows環境下的Nginx環境搭建WindowsNginx
- nginx + uWSGI + flask應用部署NginxFlask