python部署到服务器(2) 一一 nginx+uwsgi+Django

参考菜鸟教程,https://blog.csdn.net/qq_42314550/article/details/81805328,https://www.cnblogs.com/chenice/p/6921727.html

前置条件

  • 1、我们假设你已经安装了Nginx、Mysql、Django、python3、pip3等必须的软件

  • 2、有一个能用runserver正常启动的Django项目

  • 3、该项目已经上传到linux(可通过gitlab+jenkins自动部署到服务器,详见其它博客)

  • 4、通过pip安装好项目所需的其他模块。

安装Uwsgi

  • uwsgi是python的一个模块,通过pip命令安装uwsgi
    pip3 install uwsgi
  • 测试 uwsgi 是否正常
在你的项目目录中写一个test.py 
执行:vim test.py 

python3写法:(我用的是这个)
# test.py 文件内容如下
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]
  • 然后在终端运行启动命令:
uwsgi --http :8001 --wsgi-file test.py
  • 访问该地址,我的服务器是在虚拟机上, 通过 172.168.10.221:8001 访问,看在网页上是否有Hello World ,有则成功
  • 注意IP地址写你自己的主机地址,如在本地请写127.0.0.1

测试Django

  • 如果还未安装Django,请使用以下命令安装:
pip3 install django
  • 启动你的 Django 项目:
python3 manage.py runserver    默认在8000端口, 通过IP+端口号访问,检查是否正常
  • 配置django,请保证你的django程序已经关闭

  • 编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下

a、进入项目文件夹中:cd mysite 
b、编写django_wsgi.py文件:vim django_wsgi.py 
  • 写入如下内容(python3), 其实跟自带的wsgi.py文件内容差不多
import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

连接Django 和 uwsgi

  • 现在你的Django和uwsgi都能正常访问,接下来我们进入项目根目录 ,并启动服务器
cd /www/api_python

uwsgi --http :8000 --chdir /www/api_python --module django_wsgi

  • 现在可以通过IP+端口号访问你的项目了,我这里直接访问项目中具体的接口
http://172.168.10.221:8000/weather/v1/weather/today  

{"code": 200, "msg": "\u67e5\u8be2\u6210\u529f", "data": {"calendar": "\u4e94\u6708\u521d\u4e8c", "rainfall": "224.33000000000007 mm", "weather_msg": "25\u5206\u949f\u540e\u6709\u96e8,\u4f1a\u4e0b\u4e00\u4e2a\u591a\u5c0f\u65f6\uff0c\u51fa\u95e8\u8bb0\u5f97\u5e26\u4f1e", "wind_direction": "\u4e1c\u5317", "wind_level": "1\u7ea7", "t": "23.8\u2103", "t_min": "19.4\u2103", "t_max": "26.4\u2103", "air_press": "1006.0hpa", "wet": "67.0%", "wind_speed": 1.1, "evp": "\u672a\u76d1\u6d4b", "staCode": "54512", "staName": "\u56fa\u5b89", "weather": "\u591a\u4e91", "back_pic": "/images/index/cloudy.jpg"}}
  • 所有的请求都是经过uwsgi传递给Django程序的界面展示与django自启的时候一样

实现Nginx和uWSGI的连接

  • 为了实现Nginx与uWSGI的连接,两者之间将采用soket来通讯方式。

  • 在本文中,我们将使用uWSGI配置文件的方式来改进uWSGI的启动方式

  • 在项目根目录下新建djangochina_socket.xml ,写入下面内容:(我将两段配置都写入了)


<!-- 若以socket方式访问 -->
<uwsgi>
    <socket>:8077</socket>
    <chdir>/www/api_python</chdir>
    <module>django_wsgi</module>
    <processes>4</processes> <!-- 进程数 -->
    <daemonize>uwsgi.log</daemonize>
</uwsgi>

<!-- 若以http方式访问 -->
<uwsgi>
    <http>:8077</http>
    <chdir>/www/api_python</chdir>
    <module>django_wsgi</module>
    <processes>4</processes> <!-- 进程数 -->
    <daemonize>uwsgi.log</daemonize>
</uwsgi>
  • 在上面的配置中,我们使用 项目根目录中的 uwsgi.log 来记录日志,开启4个进程来处理请求。 这样,我们就配置好uWSGI了。

配置Nginx

  • 我们假设你将会把Nginx程序日志放到你的目录 /usr/local/nginx/logs/下,请确保该目录存在,当然你也可以写成别的目录
  • 我们假设你的Django的static目录是 /www/api_python/static
  • media目录是 /home/api_python/media
我们假设你的域名是 python.test.com (在调试时你可以设置成你的机器IP) 
我们假设你的域名端口是 80(在调试时你可以设置一些特殊端口如 8070) 
基于上面的假设,我们为 /usr/local/nginx/conf/nginx.conf 添加以下配置: 
在http{…}中的最后一行添加:

  • 内容如下:
server {

        listen   80;
        server_name python.test.com;
        access_log /usr/local/nginx/logs/access.log;
        error_log /usr/local/nginx/logs/error.log;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
         include             /usr/local/nginx/conf/uwsgi_params;
         uwsgi_pass     127.0.0.1:8077;     # 当访问python.test.com 时, 会转到本服务器的8077端口,也就是uwsgi
        }

        #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;
        }

        # 以下三个location 如果没有相关目录,可以不写
        location /static/ {
            alias  /www/api_python/static/;
            index  index.html index.htm;
        }

        location /media/ {
            alias  /www/api_python/media/;
        }

    location /templates/ {
            alias  /www/api_python/templates/;
        }

    }

  • 在上面的设置后,可以让Nginx来处理静态文件(/static/ 和 /media/ )。非静态文件请求Nginx会发给 socket 8077,然后让uWSGI来进行处理。
Nginx+uWSGI+Django的实现方式 
在完成上面配置后,需要按以下步骤来做: 
1、重启Nginx服务器,以使Nginx的配置生效。 
systemctl restart nginx 
重启后检查Nginx日志是否有异常。 
vim /usr/local/nginx/logs/error.log 
查看 error.log 文件内容是否有异常信息

2、启动uWSGI服务器 
cd /www/api_python
uwsgi -x djangochina_socket.xml 
检查日志 uwsgi.log 是否有异常发现。 
uwsgi.log 日志文件生成在项目目录下,所以进入项目目录执行 vim uwsgi.log 查看

3、访问服务 
基于上面的假设你的域名是python.test.com
因此,我们访问 python.test.com
我访问是具体的接口,查询实时天气:http://python.test.com/weather/v1/weather/today
如果发现程序与 单独使用Django启动的程序一模一样时,就说明成功啦! 
posted @ 2019-06-05 16:48  _Eternity味道  Views(425)  Comments(0Edit  收藏  举报