栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

阿里云架设Djano+NGINX+uwsgi踩过的坑

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

阿里云架设Djano+NGINX+uwsgi踩过的坑

尝试在阿里云服务器假设Django+Nginx+uwsgi,自己摸索比想象中的困难,摸索了好几天。梳理一下踩过的坑,权当自己的学习笔记,也给有需要的参考。


1.购买阿里云服务器,安装操作系统(我安装的系统是: Ubuntu 20.04.3 LTS),安装Python系统(Python 3.8.10)


2.安装必要的第三方库:virtualenv,virtualenv-clone,virualenvwrapper.主要是为了创建虚拟环境,其他的库可以在虚拟环境中安装。虚拟环境相关的第三库版本如下:

virtualenv             20.13.2             virtualenv-clone       0.5.7               virtualenvwrapper      4.8.


3.创建虚拟环境,并安装Django,Nginx.uwsgi等三方库。因为Nginx官方提供的是C源码,要自己进行编译,所以需要自己拥有编译所依赖的环境和库才可正常编译,GCC,PCRE,Zlib等库需要安装。GCC作为C语言编译器;PCRE是一个表达式库,Nginx中的http模块则使用到了该库来解析正则表达式;zlib库用于压缩和解压缩,方式众多,Nginx也使用到了zlib。

3.1 创建虚拟环境

   先创建目录 /data/env, 再运行 virtualenv /data/env/venv01

root@xxxxx:/# virtualenv /data/env/venv01

created virtual environment CPython3.8.10.final.0-64 in 544ms
  creator CPython3Posix(dest=/data/env/venv01, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv)
    added seed packages: pip==22.0.3, setuptools==60.9.3, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

    激活虚拟环境,source /data/env/venv01/bin/activate,激活效果如下:

root@ixxxxx:/# source /data/env/venv01/bin/activate
(venv01) root@xxxxx:/# 

    pip list 查看哪些三方库已经在虚拟环境中预装

(venv01) root@xxxxx:/# pip list
Package    Version
---------- -------
pip        22.0.3
setuptools 60.9.3
wheel      0.37.1

3.2 安装需要用的第三方库:uwsgi,django3.0,nginx需要通过apt-get 安装。

(venv01) root@xxxx:~# pip install django==3.0 uwsgi
Looking in indexes: http://mirrors.cloud.aliyuncs.com/pypi/simple/
Collecting django==3.0
  Using cached http://mirrors.cloud.aliyuncs.com/pypi/packages/43/d6/0aed0b12c66527748ce5a007da4618a65dfbe1f8fca82eccedf57d60295f/Django-3.0-py3-none-any.whl (7.4 MB)
Collecting uwsgi
  Using cached uWSGI-2.0.20-cp38-cp38-linux_x86_64.whl
Requirement already satisfied: pytz in /data/env/venv01/lib/python3.8/site-packages (from django==3.0) (2021.3)
Requirement already satisfied: asgiref~=3.2 in /data/env/venv01/lib/python3.8/site-packages (from django==3.0) (3.5.0)
Requirement already satisfied: sqlparse>=0.2.2 in /data/env/venv01/lib/python3.8/site-packages (from django==3.0) (0.4.2)
Installing collected packages: uwsgi, django
Successfully installed django-3.0 uwsgi-2.0.20

        apt-get install nginx (nginx安装在系统中,不是安装在虚拟环境中,虚拟环境只是安装python的三方库)

nginx文件安装完成之后的文件位置:

/usr/sbin/nginx:主程序/etc/nginx:存放配置文件/usr/share/nginx:存放静态文件/var/log/nginx:存放日志

运行service nginx start, 在浏览器输入服务器IP得到以下页面,说明nginx安装成功。

 4 创建Django项目,   并配置nginx,uwsgi

        4.1执行以下代码创建project01

(venv01) root@xxxxx:~# cd /data/env/venv01
(venv01) root@xxxxx:/data/env/venv01# dir
bin  include  lib  lib64  pyvenv.cfg
(venv01) root@xxxxx:/data/env/venv01# django-admin startproject project01
(venv01) root@xxxxx:/data/env/venv01# cd project01
(venv01) root@xxxxx:/data/env/venv01/project01# dir
manage.py  project01
(venv01) root@xxxxx:/data/env/venv01/project01# 

        4.2 创建超级用户,创建之前要先生成数据库python manage.py migrate,然后再创建超级用户python manage.py createsuperuser。

(venv01) root@xxxxx:/data/env/venv01/project01# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

        创建超级用户,用于project01后台管理

(venv01) xxxxx:/data/env/venv01/project01# python manage.py createsuperuser
Username (leave blank to use 'root'): rbk2022
Email address: rbk2022@admin.com
Password: 
Password (again): 
Superuser created successfully.

4.3 修改project01/project01/settings.py,允许所有终端可以访问。

ALLOWED_HOSTS = [] 改为ALLOWED_HOSTS = ['*']

4.4 配置uwsgi.ini 和nginx.conf。先在project01下创建config目录,创建uwsgi.ini和nginx.conf文件,代码分别如下:

uwsgi.ini

[uwsgi]
#指定根目录
chdir = /data/env/venv01/project01
#指定python目录
home = /data/env/venv01
#指定DJANGO环境目录
env = DJANGO_SETTINGS_MODULE = project01.settings
#指定执行代码
module = project01.wsgi:application
master = true
processes = 1
harakiri = 600
max-requests = 5000
#指定socket路径,用于和nginx交换信息
socket = 127.0.0.1:8001
uid = 1000
gid = 2000
pidfile = uwsgi-p2.pid
daemonize = uwsgi-p2.log
vacuum = true
#确保socket的读写权限
chmod-socket = 666
~                  

nginx.conf

server {
    #指定端口
    listen 80;
    #填写服务器公网IP地址
    server_name xxxxxxxx;
    access_log off;
    error_log /data/env/testenv/testproject/logs/nginx_error.log;
    location / {
        #引入在nginx中自带的uwsgi配置
        include /etc/nginx/uwsgi_params;
        #指定网站根目录下('/')的所有访问均需指向uwsgi(127.0.0.1:8001是uwsgi.ini设置的socket值)
        uwsgi_pass 127.0.0.1:8001;             }
       }

记住,需要在nginx默认设置中引入我们自定义的设置,默认设置的位置为etc/nginx/nginx.conf。打开默认设置的nginx.conf,在其中加入以下代码段。

http{
         ...
         #以上代码保持不变
         #include the customized nginx.conf file for project01 in venv01
         include /data/env/venv01/project01/config/nginx.conf;
}

至此,配置已经完成。我们看看能不能正常运行。

5. 试运行Django网页

5.1启动ngix,uwsgi。

        uwsgi --ini config/uwsgi.ini 启动uwsgi

        service nginx start 启动nginx

(venv01) root@:/data/env/venv01/project01# uwsgi --ini config/uwsgi.ini
[uWSGI] getting INI configuration from config/uwsgi.ini
(venv01) root@:/data/env/venv01/project01# service nginx start
(venv01) root@iZwz984fp76m132ex9esc8Z:/data/env/venv01/project01# 

 5.2 在浏览器中输入我们的公网ip地址.......

        

Admin界面

 大功告成?不,这里还有一个大坑等着.....试着输入我们创建的超级用户登录后台,问题来了....

知道为什么不在settings.py关闭调试了吧。我之前是关闭调试的,进行到这一步的时候老是提醒我server error,打开调试就发现这个问题了。为了解决这个问题,我花了大半天时间在网上找各种资料,大部分人都建议把db.sqlites(默认数据库)权限改成666,我试了还是不行。直到最后看到有人说要把db.sqlites3所在的文件夹权限也改成666,我试了一下,终于行了。

先改db.sqlites3权限,结果是不行的。

(venv01) root@xxxxxx:/data/env/venv01/project01# ls -l
total 164
drwxr-xr-x 2 root root   4096 Mar  5 15:09 config
-rw-r--r-- 1 root root 131072 Mar  5 14:40 db.sqlite3
-rwxr-xr-x 1 root root    629 Mar  5 14:31 manage.py
drwxr-xr-x 3 root root   4096 Mar  5 14:47 project01
-rw-r----- 1 root root  19492 Mar  5 15:28 uwsgi-p2.log
-rw-rw-rw- 1 root root      6 Mar  5 15:18 uwsgi-p2.pid
(venv01) root@xxxxxxx:/data/env/venv01/project01# chmod 666 db.sqlite3
(venv01) root@xxxxxxx:/data/env/venv01/project01# ls -l
total 164
drwxr-xr-x 2 root root   4096 Mar  5 15:09 config
-rw-rw-rw- 1 root root 131072 Mar  5 14:40 db.sqlite3
-rwxr-xr-x 1 root root    629 Mar  5 14:31 manage.py
drwxr-xr-x 3 root root   4096 Mar  5 14:47 project01
-rw-r----- 1 root root  19492 Mar  5 15:28 uwsgi-p2.log
-rw-rw-rw- 1 root root      6 Mar  5 15:18 uwsgi-p2.pid

 提示如下:(还是没变)

 继续改文件权限(/data/env/venv01/project01)

(venv01) root@xxxxx:/data/env/venv01/project01# cd ..
(venv01) root@xxxxx:/data/env/venv01# ls -l
total 20
drwxr-xr-x 3 root root 4096 Mar  5 13:39 bin
drwxr-xr-x 2 root root 4096 Mar  5 13:15 include
drwxr-xr-x 3 root root 4096 Mar  5 13:15 lib
lrwxrwxrwx 1 root root    3 Mar  5 13:15 lib64 -> lib
drwxr-xr-x 4 root root 4096 Mar  5 15:18 project01
-rw-r--r-- 1 root root  203 Mar  5 13:22 pyvenv.cfg
(venv01) root@xxxxxx:/data/env/venv01# chmod 666 project01
(venv01) root@xxxxxx:/data/env/venv01# ls -l
total 20
drwxr-xr-x 3 root root 4096 Mar  5 13:39 bin
drwxr-xr-x 2 root root 4096 Mar  5 13:15 include
drwxr-xr-x 3 root root 4096 Mar  5 13:15 lib
lrwxrwxrwx 1 root root    3 Mar  5 13:15 lib64 -> lib
drw-rw-rw- 4 root root 4096 Mar  5 15:18 project01
-rw-r--r-- 1 root root  203 Mar  5 13:22 pyvenv.cfg

改成666也是不行,766也不行,最后只好改成777了。这下终于行了。。。。

(venv01) root@xxxxx:/data/env/venv01# chmod 777 project01
(venv01) root@xxxxx:/data/env/venv01# ls -l
total 20
drwxr-xr-x 3 root root 4096 Mar  5 13:39 bin
drwxr-xr-x 2 root root 4096 Mar  5 13:15 include
drwxr-xr-x 3 root root 4096 Mar  5 13:15 lib
lrwxrwxrwx 1 root root    3 Mar  5 13:15 lib64 -> lib
drwxrwxrwx 4 root root 4096 Mar  5 15:50 project01
-rw-r--r-- 1 root root  203 Mar  5 13:22 pyvenv.cfg

成功登录

大功还未告成,目前只是完成了环境的初步搭建,静态文件还没配置,样子还有点丑,接下来继续找时间搭建,希望坑少一点。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755196.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号