Django+nginx+uwsgi部署教程(centos7+ubuntu16.4)
阿新 • • 發佈:2018-08-13
發生 manage virtual 反向代理服務器 centos 開源 -h sts mage
項目部署教程
在線演示
1.1.原理介紹
django
- 一個基於python的開源web框架
uwsgi
- 一是一個web服務器,也可以當做中間件
nginx
- 常用高性能代理服務器
wsgi.py
- django項目攜帶的一個wsgi接口文件
nginx
Nginx是一個Http和反向代理服務器 什麽是反向代理服務器呢? 正向的就是由瀏覽器主動的想代理服務器發出請求,經代理服務器做出處理後再轉給目標服務器 反向的就是不管瀏覽器同不同意,請求都會經過代理服務器處理再發給目標服務器 這其中的區別就是必須經過Nginx反向代理服務器,這就有了使用Nginx的幾個好處: 安全:不管什麽請求都要經過代理服務器,這樣就避免了外部程序直接攻擊web服務器 負載均衡:根據請求情況和服務器負載情況,將請求分配給不同的web服務器,保證服務器性能 提高web服務器的IO性能:這個我也沒看懂,總結來說就是請求從客戶端傳到web服務器是需要時間的,
傳遞多長時間就會讓這個進程阻塞多長時間,而通過反向代理,就可以在反向代理這完整接受請求,然後再
傳給web服務器,從而保證服務器性能,而且有的一些簡單的事情(比如靜態文件)可以直接由反向代理處理,不經過web服務器
流程
首先客戶端請求服務資源, nginx作為直接對外的服務接口,接收到客戶端發送過來的http請求,會解包、分析, 如果是靜態文件請求就根據nginx配置的靜態文件目錄,返回請求的資源, 如果是動態的請求,nginx就通過配置文件,將請求傳遞給uWSGI;uWSGI 將接收到的包進行處理,並轉發給wsgi, wsgi根據請求調用django工程的某個文件或函數,處理完後django將返回值交給wsgi, wsgi將返回值進行打包,轉發給uWSGI, uWSGI接收後轉發給nginx,nginx最終將返回值返回給客戶端(如瀏覽器)。 *註:不同的組件之間傳遞信息涉及到數據格式和協議的轉換
作用
1. 第一級的nginx並不是必須的,uwsgi完全可以完成整個的和瀏覽器交互的流程; 2. 在nginx上加上安全性或其他的限制,可以達到保護程序的作用; 3. uWSGI本身是內網接口,開啟多個work和processes可能也不夠用,而nginx可以代理多臺uWSGI完成uWSGI的負載均衡; 4. django在debug=False下對靜態文件的處理能力不是很好,而用nginx來處理更加高效。
centos7的部署
以全新服務器為例:
yum -y update
yum install gcc yum -y install zlib* yum install openssl-devel -y
1.2.ssh安裝
yum install openssh-server -y service sshd restart #xshell連不上,SSH服務端不允許密碼驗證。 #服務端開啟密碼驗證的方法: vim /etc/ssh/sshd_config 把PasswordAuthentication項為yes 重啟服務 service sshd restart
11.2.mysql安裝
#1.安裝 wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install mysql-community-server #2.重啟服務 service mysqld restart #3. 設置bind-ip vim /etc/my.cnf 在 [mysqld]: 下面加一行 bind-address = 0.0.0.0 #4.登錄mysql mysql -u root #5. 設置外部ip可以訪問 #mysql中輸入命令: #後面用navicat連接遠程服務器mysql的用戶名和密碼 GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION; FLUSH PRIVILEGES; #6.設置mysql密碼 進入mysql: set password =password(‘123456‘); #密碼123456 flush privileges;
11.3.pip和python3.6的安裝
#安裝pip
wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate sudo python get-pip.py
#安裝python3.6 1. 獲取 wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz tar -xzvf Python-3.6.2.tgz -C /tmp cd /tmp/Python-3.6.2/ 2. 把Python3.6安裝到 /usr/local 目錄 ./configure --prefix=/usr/local make make altinstall 3. 更改/usr/bin/python鏈接 ln -s /usr/local/bin/python3.6 /usr/bin/python3
11.4.虛擬環境安裝
yum install python-setuptools python-devel pip install virtualenvwrapper #編輯.bashrc文件 vim ~/.bashrc #添加進去 export WORKON_HOME=$HOME/.virtualenvs source /usr/bin/virtualenvwrapper.sh #sudo find / -name virtualenvwrapper.sh 查看你的virtualenvwrapper.sh在什麽地方 #重新加載.bashrc文件 source ~/.bashrc #虛擬環境保存的路徑 cd ~/.virtualenvs/ (創建的虛擬環境都會保存在這個目錄,前面設置的) #創建指定python版本的虛擬環境方法 mkvirtualenv -p /usr/local/bin/python3.6 MxOnline
workon MxShop
#進虛擬環境安裝依賴包將本地的虛擬環境安裝包導出來,上傳到服務器
首先 pip freeze > requirements.txt
pip install -r requirements.txt #安裝mysqlclient出問題 centos 7: yum install python-devel mariadb-devel -y ubuntu: sudo apt-get install libmysqlclient-dev 然後: pip install mysqlclient
11.5.git安裝
yum install git git config --global user.name "Your Name" git config --global user.email "[email protected]" cd ~/ && ssh-keygen -t rsa -C "你的郵箱" #提示的信息,直接按enter就行 cd .ssh 把公鑰文件(id_rsa.pub)中的碼復制到github #就可以開始clone代碼了 git clone [email protected]:derek-zhang123/MxOnline.git
這是我的項目目錄和虛擬環境目錄
- 項目目錄: /home/gitpackage/MxOnline
- 虛擬環境目錄: /root/.virtualenvs/MxShop
11.6.拉取項目靜態文件
#在django的setting文件中,添加下面一行內容: STATIC_ROOT = os.path.join(BASE_DIR, "static/") #運行命令 python manage.py collectstatic
settings中其它需要設置的地方
DEBUG = True ALLOWED_HOSTS = [‘*‘] #自己設置可以訪問的域名,‘*’代表所有都可以訪問
11.7.uwsgi
(1)安裝
進虛擬環境安裝
workon MxOnline pip install uwsgi
(2)在項目目錄下新建uwsgi.ini文件
MxOnine/uwsgi.ini
[uwsgi] socket =127.0.0.1:8000 chdir = /home/gitpackage/MxOnline module = MxOnline.wsgi master = true processes = 4 vacuum = true virtualenv = /root/.virtualenvs/MxShop logto = /tmp/mylog.log
註:
chdir: 表示需要操作的目錄,也就是項目的目錄
module: wsgi文件的路徑
processes: 進程數
virtualenv:虛擬環境的目錄
11.8.nginx
(1)安裝
這裏有安裝方法:https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7
sudo yum install nginx #可能會用到的命令 service nginx restart service nginx stop service nginx start
(2)配置文件
在/etc/nginx/conf.d下新建MxOnline.conf
# the upstream component nginx needs to connect to upstream django { # 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) } # configuration of the server server { # the port your site will be served on listen 80; # the domain name it will serve for server_name 180.76.56.222; # substitute your machine‘s IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django media location /media { alias /home/gitpackage/MxOnline/media; # 指向django的media目錄 } location /static { alias /home/gitpackage/MxOnline/static; # 指向django的static目錄 } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include uwsgi_params;
}
}
配置好後
nginx -t #提示success說明沒問題 service nginx restart
11.9.navicat數據傳輸
一切都配置好後,把本地數據庫的數據傳到服務器上面
(1)連接你的服務器數據庫
(2)新建項目數據庫
(3)傳輸數據
數據傳輸完成,配置也都配置好後,就可以開始訪問了
#創建超級用戶
python manage.py createsuperuser
#把uswgi服務開啟
uwsgi --ini uwsgi.ini #訪問 http://你的ip地址/
ubuntu的基本環境搭建
sudo apt-get update apt-get install gcc apt-get install libssl-dev sudo apt-get install openssl apt-get install zlib1g apt-get install zlib1g.dev
mysql
sudo apt-get install mysql-server 輸入密碼 mysql -u root -p sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf bind-address = 0.0.0.0 #添加進去 sudo service mysql restart #設置遠程訪問 GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION; flush privileges;
pip和python3.6
wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate sudo python get-pip.py
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz tar -xzvf Python-3.6.2.tgz -C /tmp cd /tmp/Python-3.6.2/ 2. 把Python3.6安裝到 /usr/local 目錄 ./configure --prefix=/usr/local make make altinstall 3. 更改/usr/bin/python鏈接 ln -s /usr/local/bin/python3.6 /usr/bin/python3
虛擬環境
pip install virtualenv pip install virtualenvwrapper vim ~/.bashrc export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh source ~/.bashrc
mkvirtualenv MxOnline --python=python3.6 worko MxOnline sudo apt-get install libmysqlclient-dev pip install -r requirements.txt
git
sudo apt-get update sudo apt-get install git git config --global user.name "Your Name" git config --global user.email "[email protected]"
如果安裝軟件時候報錯
E: Sub-process /usr/bin/dpkg returned an error code (1)錯誤解決 在用apt-get安裝軟件時出現了類似於 install-info: No dir file specified; try --help for more information.dpkg:處理 gettext (--configure)時出錯: 子進程 post-installation script 返回了錯誤號 1 在處理時有錯誤發生: findutils E: Sub-process /usr/bin/dpkg returned an error code (1) 辦法如下: 1.$ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old //現將info文件夾更名 2.$ sudo mkdir /var/lib/dpkg/info //再新建一個新的info文件夾 3.$ sudo apt-get update,再$sudoapt-get -f install //不用解釋了吧 4.$ sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old //執行完上一步操作後會在新的info文件夾下生成一些文件,現將這些文件全部移到info_old文件夾下 5.$ sudo rm -rf /var/lib/dpkg/info //把自己新建的info文件夾刪掉 6.$ sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info //把以前的info文件夾重新改回名字 到此問題順利解決
github
cd ~/ && ssh-keygen -t rsa -C "你的郵箱" #提示的信息,直接按enter就行 cd .ssh 把公鑰文件(id_rsa.pub)中的碼復制到github #就可以開始clone代碼了 git clone [email protected]:derek-zhang123/MxOnline.git
Django+nginx+uwsgi部署教程(centos7+ubuntu16.4)