尝试在阿里云服务器假设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
成功登录
大功还未告成,目前只是完成了环境的初步搭建,静态文件还没配置,样子还有点丑,接下来继续找时间搭建,希望坑少一点。



