明天吧 發表於 2019-6-28 15:59:00

Python Django项目部署 Linux 服务器

<h5 id="项目依赖-linux-centos7-阿里云轻量级服务器--python-372--django-221--restframework-394--mysql-57"><strong>项目依赖: Linux Centos7 (阿里云轻量级服务器) + Python 3.7.2 + Django 2.2.1 + restframework 3.9.4 + mysql 5.7</strong></h5>
<p>1 安装 python3 到 Centos7, 先安装软件管理包和可能使用的依赖</p>
<pre><code class="language-shell">yum -y groupinstall "Development tools"
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
</code></pre>
<p>2 下载Pyhton3到/usr/local 目录</p>
<pre><code class="language-shell">wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
</code></pre>
<p>3解压</p>
<pre><code class="language-shell">tar -zxvf Python-3.7.2.tgz
</code></pre>
<p>​</p>
<p>4 进入到解压好的python文件中</p>
<pre><code class="language-shell">cd Python-3.7.2
</code></pre>
<p>​</p>
<p>5 编译安装到指定路径</p>
<pre><code class="language-shell">./configure --prefix=/usr/local/python3
</code></pre>
<p>​</p>
<p>6 安装python3</p>
<pre><code class="language-shell">make

make install

</code></pre>
<p>7 安装完成之后 建立软链接 添加变量 方便在终端中直接使用python3</p>
<pre><code class="language-shell">ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3
</code></pre>
<p>​</p>
<p>8 Python3安装完成之后pip3也一块安装完成,不需要再单独安装一样建立软链接<br>
同样给pip3建立软链接</p>
<pre><code class="language-shell">ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3

注: 如果软链建立完成,但是却无法使用的时候执行下面命令:
       mv pip pip2# (将文件 pip 更名为 pip2 )
       ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
</code></pre>
<p>9 安装virtualenv, 方便不同版本项目管理。</p>
<pre><code class="language-shell">pip3 install virtualenv
</code></pre>
<p>​</p>
<p>10 建立软链接</p>
<pre><code class="language-shell">ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv3
</code></pre>
<p>​</p>
<p>11 安装成功在根目录下建立两个文件夹,主要用于存放env和网站文件的 (文件创建随意,根据实际需求)。</p>
<pre><code class="language-shell">mkdir -p /data/env        # 存放虚拟环境
       
mkdir -p /data/wwwroot        # 存放web项目

</code></pre>
<p>​</p>
<p>12切换到/data/env/下,创建指定版本的虚拟环境。</p>
<pre><code class="language-shell">       virtualenv3 --python=/usr/bin/python qize_demo (项目名)        # 创建虚拟环境

       # 然后进入
       cd /data/env/qize_demo/bin

       # 进入bin目录后开启虚拟环境,执行命令
       source activate       

           # 注:(启动后出现 (qize_demo),说明是成功进入虚拟环境。)
</code></pre>
<p>13 虚拟环境里用pip3安django和uwsgi (留意:uwsgi要安装两次,先在系统里安装一次,然后进入对应的虚拟环境安装一次。)</p>
<pre><code class="language-shell">pip3 install django#(如果用于生产的话,则需要指定安装和你项目相同的版本)

pip3 install uwsgi

# 给uwsgi建立软链接,方便使用

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

</code></pre>
<p>​</p>
<p>14 在本地项目目录下用下面的命令把当前的环境依赖包导出到requirements.txt文件</p>
<pre><code class="language-shell">pip freeze &gt; requirements.txt
</code></pre>
<p>​<br>
15 把项目源码压缩打包。把项目上传到服务器对应的目录里(/data/wwwroot/),解压。</p>
<p>16 进入解压好的项目根路径中安装requirements.txt里的依赖包。</p>
<pre><code class="language-shell">pip3 install -r requirements.txt
</code></pre>
<p>​</p>
<p>17导入数据库到服务器。(如果用的是Mysql的话)</p>
<p>导出Mysql,django为你的数据库</p>
<pre><code class="language-shell">mysqldump -uroot -p password django&gt;django.sql
</code></pre>
<p>把django.sql上传到服务器,在服务器里用下面命令导入</p>
<pre><code class="language-shell">mysql -uroot -ppassword

use dajngo;

source your Path\django.sql

</code></pre>
<p>​</p>
<p>18 通过 <strong>python3 manage.py runserver</strong> 运行一下项目,如果能正常启动则进行下一步,不能正常运行往上检查 (下面给出几个常见错误和解决方案)。</p>
<p><strong>报错1</strong>:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11 解决方案:</p>
<p><strong>解决</strong>:编辑Python安装路径下的 <strong>Python36-32\Lib\site-packages\django\db\backends\mysql\base.py</strong></p>
<pre><code class="language-python">将文件中的如下代码注释

#if version &lt; (1, 3, 3):
#    raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
</code></pre>
<ul>
<li></li>
<li></li>
</ul>
<p><strong>报错2</strong>:File "/usr/local/python3/lib/python3.7/site-packages/django/db/backends/mysql/operations.py", line 146, in last_executed_query query = query.decode(errors='replace')</p>
<p>AttributeError: 'str' object has no attribute 'decode'</p>
<p><strong>解决</strong>:编辑</p>
<p><strong>/usr/local/python3/lib/python3.7/site-packages/django/db/backends/mysql/operations.py</strong></p>
<p>的 第146 行,</p>
<pre><code class="language-python"># 将 decode 改为 encode 保存并退出
query = query.decode(errors='replace') 改为 query = query.encode(errors='replace')
</code></pre>
<p>19在项目根目录里添加uwsgi配置文件 (qize_demo.xml)</p>
<pre><code class="language-xml">&lt;uwsgi&gt;      

&lt;socket&gt;127.0.0.1:8070/&lt;/socket&gt;&lt;!-- 内部端口,自定义 --&gt;

&lt;chdir&gt;/data/wwwroot/qize_demo/&lt;/chdir&gt;&lt;!-- 项目路径 --&gt;            

&lt;module&gt;qize_demo.wsgi&lt;/module&gt;

&lt;processes&gt;4&lt;/processes&gt; &lt;!-- 进程数 --&gt;   

&lt;daemonize&gt;uwsgi.log&lt;/daemonize&gt;&lt;!-- 日志文件 --&gt;

&lt;/uwsgi&gt;

</code></pre>
<p>​</p>
<p>20 配置Nginx配置文件(把原先的配置文件可以备份以下,然后将下面的替换进去)。</p>
<pre><code class="language-nginx">events {

    worker_connections1024;

}

http {

    include       mime.types;
    default_typeapplication/octet-stream;
    sendfile      on;
    server {
      listen 80;
      server_name127.0.0.1:80;# 改为自己的域名,没域名修改为127.0.0.1:80
      charset utf-8;
      location / {
         include uwsgi_params;
         uwsgi_pass 127.0.0.1:8070;#端口要和uwsgi里配置的一样
         uwsgi_param UWSGI_SCRIPT qize_demo.wsgi;                #wsgi.py所在的目录名+.wsgi
         uwsgi_param UWSGI_CHDIR /data/wwwroot/qize_demo/; #项目路径
         
      }
      location /static {
            alias /data/wwwroot/qize_demo/static; #静态资源路径
      }
   
      location /templates {
            alias /data/wwwroot/qize_demo/templates;
      }
    }

}

</code></pre>
<p><strong>留意:</strong>一定要注意Uwsgi和Nginx配置文件里的项目路径和静态资源路径,填写正确了才能成功访问。不然会出现502错误。还有就是,修改Django文件和其它配置文件之后,一定要重启Uwsgi和Nginx,不然不生效。</p>
<p>21 Uwsgi和Nginx重启方法:</p>
<p><strong>uwsgi 启动方法</strong></p>
<pre><code class="language-shell">uwsgi -x qize_demo.xml
</code></pre>
<p><strong>Nginx 重启方法</strong></p>
<pre><code class="language-shell">nginx -s reload
</code></pre>
<ul>
<li></li>
</ul>
<p>然后在浏览器里访问服务器ip(或域名),就能查看到项目。</p>
<p>如果想使用域名访问项目,先在域名管理后台把域名解析到服务器IP上来,之后在Nginx配置文件里绑定域名。然后在浏览器里通过绑定的域名访问项目。</p>
<ul>
<li></li>
</ul>
<h4 id="以下总结一些问题">以下总结一些问题:</h4>
<p>1 如果访问出现 500 以上的错误信息并有nginx的信息,一般是nginx配置出了问题。去查看nginx.conf配置中的项目路径是否正确,uwsgi_pass 参数的端口和 uwsgi的xml 文件中端口是否一致,是否修改完配置后重新启动了nginx。还有就是可以去项目根路径下 python manage.py runserver 启动下项目,看看有没有报错,也有可能是程序本身就有问题。</p>
<p>2 如果访问出现 400 以上的错误信息,重点检查项目路径,包括 tempates / static 静态路径是否正确,和项目中 settings 是否配置了 tempates / static 文件的访问路径,以及 url 是否正确,其次还有html文件中引入的 css, js, img 等文件路径是否正确, 比如:</p>
<pre><code>css文件:&lt;link rel="stylesheet" href="/static/css/q.css"&gt;
js文件 :&lt;script src="/static/js/q.js"&gt;&lt;/script&gt;
</code></pre>
<p>​</p>
<h4 id="以下总结下注意事项">以下总结下注意事项:</h4>
<p>1 项目上线后记得 DEBUG = False 这样设置,这样的话你的项目访问失败就不会有 Django 的错误信息了</p>
<p>2 设置所有 IP 都可访问 (settings.py)</p>
<pre><code class="language-shell">   ALLOWED_HOSTS = ['*']
</code></pre>
<p>3数据库设置(settings.py)</p>
<pre><code class="language-python">DATABASES = {
    'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'sql_base',                # 库名 (根据实际数据库名进行修改)
      'PORT': 3306,                        # 端口(不用改)
      'HOST': '127.0.0.1',        # 本地host(不用改)
      "USER": 'root',                        # 用户名
      'PASSWORD': '123456'        # 密码
    }
}
</code></pre>
<p>​</p><br><br>
来源:https://www.cnblogs.com/chaoqi/p/11103188.html
頁: [1]
查看完整版本: Python Django项目部署 Linux 服务器