ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[toc] # Web应用部署 在我的阿里云主机部署Django之web项目,基本的部署架构是,Ngix -> uWSGI -> Django,安装和配置参考[Django Nginx+uwsgi 安装配置](http://www.runoob.com/django/django-nginx-uwsgi.html)和[Python uWSGI 安装配置](http://www.runoob.com/python3/python-uwsgi.html)。 * Nginx是Web服务器 * uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。[参考uWSGI、WSGI和uwsgi](https://www.cnblogs.com/wspblog/p/8575101.html) * Django是WEB App框架 以下是Django项目的目录(PyCharm构建) ``` ./MyDjangoProject └───myapp └───mysite └───myusers └───static └───venv │ db.sqlite3 │ manage.py │ ... ``` 以下是阿里云主机的相关目录 ``` /root └───downloads │ │ ... │ └───qb_web_prj └───ex_nginx_conf # nginx的相关配置文件 └───ex_wsgi # uWSGI的相关文件 └───MyDjangoProject # 我的Django项目 └───qb_venv #虚拟环境venv ``` ## Virtualenv(Python虚拟环境) `virtualenv`is a tool to create isolated Python environments.virtualenv 是一个创建隔绝的Python环境的工具。[virtualenv安装使用简介](https://www.cnblogs.com/technologylife/p/6635631.html) 1. 安装virtualenv ``` apt install virtualenv ``` 2. 创建一个虚拟环境 ~~~ $ cd my_project_dir $ virtualenv venv  #venv为虚拟环境目录名,目录名自定义 $ virtualenv -p /usr/bin/python2.7 venv    # -p参数指定Python解释器程序路径 ~~~ 2. 要开始使用虚拟环境,其需要被激活: ~~~ $ source venv/bin/activate    ~~~ `从现在起,任何你使用pip安装的包将会放在 venv` 文件夹中,与全局安装的Python隔绝开。 像平常一样安装包,比如: ~~~ $ pip install requests ~~~ 3. 如果你在虚拟环境中暂时完成了工作,则可以停用它: ~~~ $ . venv/bin/deactivate ~~~ 这将会回到系统默认的Python解释器,包括已安装的库也会回到默认的。 要删除一个虚拟环境,只需删除它的文件夹。(执行 `rm -rf venv` )。 这里virtualenv 有些不便,因为virtual的启动、停止脚本都在特定文件夹,可能一段时间后,你可能会有很多个虚拟环境散落在系统各处,你可能忘记它们的名字或者位置。 * 安装virtualenv问题的处理 [# virtualenv setuptools pkg\_resources pip wheel failed with error code 2](https://blog.csdn.net/hymanjack/article/details/80341943) ## 在我的阿里云主机部署Django项目 0. 安装虚拟环境virtualenv,启动虚拟环境,在虚拟环境中安装Django ``` (qb_venv) root@xxxx:~:python --version Python 3.5.2 ``` ### Django项目部署测试 1. 把PyCharm建立的django项目上传至阿里云主机 2. 用python manage.py runserver 0.0.0.0:9000命令运行django程序后,通过浏览器访问服务器网址的9000端口,出现访问错误,报错为 `Invalid HTTP_HOST header: ‘xxx.xx.xxx.xxx:9000’. You may need to add ‘xxx.xx’ to ALLOWED_HOSTS`。 解决办法是:修改django项目的setting.py文件 将`ALLOWED_HOSTS = []`改为`ALLOWED_HOSTS = ['*']`, 3. 运行我的django项目`python manage.py runserver 0.0.0.0:9000` 正常的话,在浏览器输入 **http://ip:9000**,可以看到自己页面。 ### uWSGI安装测试 1. [Python uWSGI 安装配置](http://www.runoob.com/python3/python-uwsgi.html) 2. 按以上推荐的方法新建一个简单的web处理程序,然后启动http服务( **uwsgi --http :9000 --wsgi-file foobar.py**) 正常的话,在浏览器输入 **http://ip:9000**,可以看到自己页面。 ### Nginx WEB服务器安装测试 1. [阿里云Ubuntu 16.04系统下安装Nginx](https://www.jianshu.com/p/cee284a90c0e) 2. 启动Nginx,进入Nginx的安装目录,也就是刚才我们配置的`/usr/local/nginx`下的`sbin`目录下执行`./nginx` 3. Nginx端口默认端口为80,我们可以通过配置的IP或者域名进行访问,出现下图,说明Nginx启动成功,或者通过`ps -ref |grep nginx`查看Nginx的进程得知Nginx是否启动成功! 4. Nginx的配置文件为`/etc/nginx/nginx.conf` 5. Nginx的常用命令 * 关闭命令:`./nginx -s stop` * 退出命令:`./nginx -s quit`,等程序执行完毕后关闭,建议使用此命令。 * 动态加载配置文件`./nginx -s reload`可以不关闭Nginx的情况下更新配置文件,非常好用! * 查看Nginx版本:`./nginx -v` ### 部署Django项目@Nginx Django,uWSGI,Nginx分别安装测试OK,下面就配置相关文件 1. 配置uwsgi的ini文件 我这里的uwsgi配置文件qbuwsgi.ini ``` [uwsgi] # 对外提供 http 服务的端口 # http = :9000 #the local unix socket file than commnuincate to Nginx 用于和 nginx 进行数据交互的端口 #socket=/data/wwwroot/DevOps/uwsgi/uwsgi.sock socket = 127.0.0.1:9008 # the base directory (full path) django 程序的主目录 chdir=/root/qb_web_prj/MyDjangoProject # Django's wsgi file #module=mysite.wsgi:application wsgi-file = mysite/wsgi.py # maximum number of worker processes processes = 4 #thread numbers startched in each worker process threads = 2 #monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况 stats = 127.0.0.1:9191 # clear environment on exit vacuum = true # 后台运行,并输出日志 daemonize = /var/log/uwsgi.log # 在定义的文件夹内创建uwsgi.pid(该pid文件保存了uwsgi的进程号,用来重启和停止uwsgi服务)和uwsgi.status(用来查看uwsgi的服务状态) # stats = %(chdir)/uwsgi/uwsgi.status # 注意这里用的是相对地址,以下定义的是绝对地址 stats = /root/qb_web_prj/ex_wsgi/uwsgi.status pidfile = /root/qb_web_prj/ex_wsgi/uwsgi.pid ``` 2. 启动uwsgi uwsgi --ini qbuwsgi.ini,这样就启动了uwsgi 如何启动停止uwsgi参考[uwsgi服务启动(start)停止(stop)重新装载(reload)](https://blog.51cto.com/12482328/2087535) * `uwsgi --ini qbuwsgin.ini` # 启动 * `uwsgi --reload 路径/uwsgi.pid` # 重启 * `uwsgi --connect-and-read 路径/uwsgi.status` # 查看运行状态 * `uwsgi --stop uwsgi/uwsgi.pid` #停止 * `ps aux | grep uwsgi` # 查看uwsgi的进程 3. 新建nginx配置文件 nginx的配置文件是`/etc/nginx/nginx.conf`,配置文件nginx.conf摘要如下: ``` http { ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } ``` 注意到该配置文件包含了/etc/nginx/sites-enabled/下的相关文件,把自己的相关配置文件放这里就好,这里我是这么处理的:新建文件/root/qb_web_prj/ex_nginx_conf/qb-django-nginx.conf, 然后把该文件软连接至/etc/nginx/sites-enabled/,qb-django-nginx.conf内容如下: ``` server { listen 9007; #web服务对外端口地址,即http访问端口号 server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9008; #对应uwsgi的输入端口号 uwsgi_param UWSGI_SCRIPT mysite.wsgi; uwsgi_param UWSGI_CHDIR /root/qb_web_prj/MyDjangoProject/mysite; index index.html index.htm; client_max_body_size 35m; } } ``` 4. 启动nginx uwsgi已经启动了,nginx的配置文件也已经准备就绪,现在就可以启动nginx了: 输入命令`nginx`即可 nginx的常用命令如下: * nginx -t # 启动 Nginx * nginx -t # 检查配置文件nginx.conf的正确性命令 * nginx -s reload # 重新载入配置文件 * nginx -s reopen # 重启 Nginx * nginx -s stop # 停止 Nginx 5. 浏览器查看结果 在浏览器输入http://xxx.xxx.xxx.xxx:9007就能看到django项目的展示! 大概流程是这样的: 1. 浏览器向http://xxx.xxx.xxx.xxx:9007发送请求; 2. nginx web服务器在端口号9007收到请求后,把请求通过socket = 127.0.0.1:9008 转发给了uwsgi服务端; 3. uwsgi服务端与django项目交互后再把结果原路反馈给浏览器,用户就可以在浏览器看到结果了!!!