文章目录
依然开源项目(dailyfresh-B2C)为例:
1)根据start.md进行
内容如下:
#### 虚拟环境
开启worker,
列出所有:lsvirtualenv
workon df-env (退出 deactivate)
#### requirements.txt用来记录项目所有的依赖包和版本号:
```pip freeze >requirements.txt```
安装requirement.txt:
```pip install -r requirements.txt```
建立索引数据
python manage.py rebuild_index
----
### Linux
#### mysql
mysql -uroot -p
password: Mathkk123+-
查看运行状态
systemctl status mysqld.service
#### redis
检查端口: netstat -ltnp |grep 6379
启动: service redisd start
关闭: service redisd stop
可进入终端
cd /usr/local/redis-5.0-rc3/src
./redis-cli
查看库
select 1
所有数据
keys * hgetall cart_2
#### celery启动异步注册任务
#### 虚拟环境
开启worker, (退出 deactivate)
workon df-env
在项目目录下执行:cd /opt/dailyfresh-celerytasks
```celery -A celery_tasks.tasks worker -Q queue --loglevel=info```
或
```celery -A celery_tasks.tasks worker --loglevel=info ```
##### FastDFS启动分布式文件存储系统
##### 启动fastdfs服务命令如下:
```service fdfs_trackerd start```
```service fdfs_storaged start```
#### 测试Tracker 和 Storage 服务通信
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
#### 查看服务
netstat -unltp|grep fdfs
#### nginx
#### 启动nginx
cd /usr/local/nginx/sbin/
./nginx
#### 查看nginx服务
ps aux|grep nginx
1.1 开启虚拟环境
具体部署可见本栏的《【实战学习(二)】开源项目学习之准备工作》(https://blog.csdn.net/m0_37621024/article/details/115834177)
1.2 安装/检查项目所有的依赖包
具体部署可见本栏的《【实战学习(三)】开源项目学习之Django框架简介以及启动》(https://blog.csdn.net/m0_37621024/article/details/115919142)
1.3 开启/查看mysql的运行
mysql相关的部署可见本栏的《【实战学习(三)】开源项目学习之Django框架简介以及启动》(https://blog.csdn.net/m0_37621024/article/details/115919142)
1.4 开启/查看Redis的运行
Redis的部署可见本栏的《【实战学习(六)】开源项目学习之redis部署》(https://blog.csdn.net/m0_37621024/article/details/116242726)
1.5 执行celery
启动服务使用的指令:
在项目目录下执行:cd /opt/dailyfresh-celerytasks
celery -A celery_tasks.tasks worker -Q queue --loglevel=info
或
celery -A celery_tasks.tasks worker --loglevel=info
-
-A:指对应的应用程序, 其参数是项目中 Celery实例的位置。
-
worker:指这里要启动的worker。
-
任务默认是进程执行,如果想要使用高并发,可以使用协程方式执行任务。
-
默认是进程池方式,进程数以当前机器的CPU核数为参考,每个CPU开四个进程。
-
如何自己指定进程数:celery worker -A proj --concurrency=4
-
如何改变进程池方式为协程方式:celery worker -A proj --concurrency=1000 -P eventlet -c 1000
实际执行:
(dailyfresh) he@he-ThinkPad-X200:~/github-learning/dailyfresh-B2C/dailyfresh$ celery -A celery_tasks.tasks worker --loglevel=info
Traceback (most recent call last):
File "/home/he/.virtualenvs/dailyfresh/lib/python3.7/site-packages/celery/app/utils.py", line 359, in find_app
sym = symbol_by_name(app, imp=imp)
File "/home/he/.virtualenvs/dailyfresh/lib/python3.7/site-packages/celery/bin/base.py", line 504, in symbol_by_name
return imports.symbol_by_name(name, imp=imp)
File "/home/he/.virtualenvs/dailyfresh/lib/python3.7/site-packages/kombu/utils/imports.py", line 62, in symbol_by_name
return getattr(module, cls_name) if cls_name else module
AttributeError: module 'celery_tasks' has no attribute 'tasks'
*报错之module ‘celery_tasks’ has no attribute ‘tasks’
查阅了很多资料,依然不行。仔细比对了网上其他人的代码和本地的代码,发现有几行被注释掉了:
# django环境的初始化,在任务处理者worker一端加以下几句
import os
# import django
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')
# django.setup()
去掉注释后重新执行:
(dailyfresh) he@he-ThinkPad-X200:~/github-learning/dailyfresh-B2C/dailyfresh$ celery -A celery_tasks.tasks worker --loglevel=info
-------------- celery@he-ThinkPad-X200 v4.2.1 (windowlicker)
---- **** -----
--- * *** * -- Linux-5.8.0-48-generic-x86_64-with-debian-bullseye-sid 2021-05-01 16:29:32
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: celery_tasks.tasks:0x7f20b8d53590
- ** ---------- .> transport: redis://127.0.0.1:6379/8
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 2 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. celery_tasks.tasks.generate_static_index_html
. celery_tasks.tasks.send_register_active_email
[2021-05-01 16:29:33,044: INFO/MainProcess] Connected to redis://127.0.0.1:6379/8
[2021-05-01 16:29:33,060: INFO/MainProcess] mingle: searching for neighbors
[2021-05-01 16:29:34,093: INFO/MainProcess] mingle: all alone
[2021-05-01 16:29:34,131: WARNING/MainProcess] /home/he/.virtualenvs/dailyfresh/lib/python3.7/site-packages/celery/fixups/django.py:200: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
warnings.warn('Using settings.DEBUG leads to a memory leak, never '
[2021-05-01 16:29:34,131: INFO/MainProcess] celery@he-ThinkPad-X200 ready.
[2021-05-01 16:29:34,136: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[2e0677b0-7799-4514-a8d8-0bd67daf5a28]
[2021-05-01 16:29:34,680: INFO/ForkPoolWorker-2] Task celery_tasks.tasks.send_register_active_email[2e0677b0-7799-4514-a8d8-0bd67daf5a28] succeeded in 0.5425468019966502s: None
注意:其中UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
是说 :userwarning:使用settings.debug会导致内存泄漏,请不要在生产环境中使用此设置!
所以在settings配置文件中把debug改为False,再次运行:
(dailyfresh) he@he-ThinkPad-X200:~/github-learning/dailyfresh-B2C/dailyfresh$ celery -A celery_tasks.tasks worker --loglevel=info
-------------- celery@he-ThinkPad-X200 v4.2.1 (windowlicker)
---- **** -----
--- * *** * -- Linux-5.8.0-48-generic-x86_64-with-debian-bullseye-sid 2021-05-01 16:41:13
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: celery_tasks.tasks:0x7f9abf818a10
- ** ---------- .> transport: redis://127.0.0.1:6379/8
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 2 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. celery_tasks.tasks.generate_static_index_html
. celery_tasks.tasks.send_register_active_email
[2021-05-01 16:41:13,606: INFO/MainProcess] Connected to redis://127.0.0.1:6379/8
[2021-05-01 16:41:13,620: INFO/MainProcess] mingle: searching for neighbors
[2021-05-01 16:41:14,653: INFO/MainProcess] mingle: all alone
[2021-05-01 16:41:14,674: INFO/MainProcess] celery@he-ThinkPad-X200 ready.
1.6 FastDFS启动分布式文件存储系统
具体部署请移步本栏的《【实战学习(七)】开源项目学习之FastDFS部署》。(https://blog.csdn.net/m0_37621024/article/details/116331450)
启动fastdfs服务命令如下:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start # 启动tracker(支持start|stop|restart)
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
netstat -apn | grep fdfs # 查看端口情况
测试Tracker 和 Storage 服务通信,即通过monitor来查看storage是否成功绑定 :
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
查看服务 :
he@he-ThinkPad-X200:~$ netstat -unltp|grep fdfs
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 221674/fdfs_tracker
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 221668/fdfs_storage
1.7 启动Nginx
安装及部署可参考本栏的《【实战学习(四)】开源项目学习之Nginx介绍及安装部署》。(https://blog.csdn.net/m0_37621024/article/details/116074201)
he@he-ThinkPad-X200:~$ whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz
he@he-ThinkPad-X200:~$ /usr/sbin/nginx
查看nginx服务:
he@he-ThinkPad-X200:~$ ps -aux | grep nginx
root 240129 0.0 0.1 57980 6280 ? Ss 21:58 0:00 nginx: master process /usr/sbin/nginx
www-data 240677 0.0 0.1 58552 6208 ? S 22:40 0:00 nginx: worker process
www-data 240678 0.0 0.1 58552 6208 ? S 22:40 0:00 nginx: worker process
he 240900 0.0 0.0 17676 728 pts/3 S+ 23:02 0:00 grep --color=auto nginx
1.8 debug=True的情况下运行
执行完1.1-1.7后,输入python manage.py runserver,浏览器登录localhost:8000,提示Page not found(404):
(dailyfresh) he@he-ThinkPad-X200:~/github-learning/dailyfresh-B2C/dailyfresh$ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
May 05, 2021 - 16:37:52
Django version 2.1.7, using settings 'dailyfresh.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Not Found: /
[05/May/2021 16:37:56] "GET / HTTP/1.1" 404 3027
1.8.1 遇到的问题之Page not found(404)
- 原因:找不到/,说明对于nginx不知道如何处理路径为/的请求。
- 解决方法:在nginx.conf中添加对应的配置:
# github上给出的nginx.conf的部分内容
worker_processes 1; # nginx进程数
events {
worker_connections 1024; # 单个进程最大连接数(最大连接数=连接数*进程数)
}
http { # 设定http服务器
include mime.types; # 文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; # 长连接超时时间,单位是秒
#gzip on;
upstream dailyfresh { # upstream表示负载服务器池,这里配置upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。格式举例:server 192.168.80.121:80 weight=3;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server { # 虚拟主机的配置
listen 80; # 监听端口
server_name localhost; # 域名可以有多个,用空格隔开
location /{ # 转发请求给uwsgi
# 包含uwsgi请求的参数
include uwsgi_params;
# 转交请求给uwsgi
#uwsgi_pass 127.0.0.1:8080; # uwsgi服务器的ip:port(这是单台uwsgi配置)
uwsgi_pass dailyfresh; # 根据业务需求,实施负载均衡就用这个
}
location /static {
# 指定静态文件存放的目录
alias /var/www/dailyfresh/static/;
}
location = /{ # 对 "/" 启用反向代理,当用户访问127.0.0.1时,在nginx中配置把这个请求转发给172.16.66.228:80(nginx)服务器,让这台服务器提供静态首页。
配置如下:
proxy_pass http://172.16.179.131; # 设置被代理服务器地址
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
-
补充:
- 如果使用的是python manage.py runserver 这个命令来启动django并且DEBUG=True的话,django默认是会为setting.py里的STATIC_URL变量开头的静态文件请求做路由的。
- 但是如果用的是uwsgi,并且在生产环境一般设置DEBUG=False,这两种情况django都是不会为STATIC_URL的静态文件做路由的,所以需要在nginx配置里对静态文件提前进行一个转发或者在项目最外层urls.py中做匹配路由,这两种方法都需要将文件收集到STATIC_ROOT中。
2)在开发者模式(Debug=True)下探索该项目
2.1 Django的Debug模式
在settings.py文件中有一个变量为DEBUG,默认值为True:
2.1.1 DEBUG=True时:
- 即开启了开发者模式,如果修改了Django项目的代码,只要按下ctrl+s,那么Django就会自动重启项目,不需要手动重启。
- 如果Django项目中的代码出现bug,在浏览器中和控制台会打印出错信息,方便调试代码。
2.1.1.1 在开发模式下(Debug=True)时,访问静态文件的两种情况:
- 可以在所在的project下建立相应的app, 然后每个app下都建立相应的static文件夹,文件夹名称一定要是static,Django将通过django.contrib.staticfiles在每个app的static文件夹中自动查找这些静态文件。
- 配置STATICFILES_DIRS,在所有的app文件外面,建立一个公共的文件夹,,因为有些静态文件不是某个app独有的,那么就可以把它放到一个公共文件夹里面,方便管理(注意,建立一个公共的静态文件的文件夹只是一种易于管理的做法,但是不是必须的,app是可以跨app应用静态文件的,因为部署模式下最后所有的静态文件都会在STATIC_ROOT里面存在)。
————————————————
版权声明:本文为CSDN博主「光明小学王小雨」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41475058/article/details/105856148
- 不过第二种方式比较适合自己写项目的时候,毕竟自己写的时候整个项目都是自己控制的,static文件放一起也清楚,如果是合作写项目的话可以放在每个app下,然后在settings.py里的STATICFILES_DIRS中添加路径。
本项目用的是第二种:
2.1.1.2 STATIC_ROOT
STATIC_ROOT 是在部署静态文件时(pyhton manage.py collectstatic)所有的静态文静聚合的目录。
- STATIC_ROOT要写成绝对地址。
- 只有在部署模式下(Debug=False)时生效。
- 在部署模式(Debug=False)时,Django会从STATIC_ROOT设置的文件夹读取静态文件,而不再从STATICFILES_DIRS设置的文件夹或app下的static文件夹。所以在(Debug=False)时需要先 python manage.py collectstatic同步一下静态文件。
2.1.1.3 STATIC_URL
- 当创建Django项目的时候,在setting.py中默认就已经设置了STATIC_URL = ‘/static/’,通过http://127.0.0.1/static/XXX就可以访问相关的静态文件。
- STATIC_URL其实是一个别名,是用于引用STATICFILES_DIRS或STATIC_ROOT所指向的静态文件的,用{% static %}来引入静态文件的话,就不用每个静态文件都要绝对路径。
STATIC_URL如何能正确地找到静态文件地址?
1、在开发模式下(Debug=True)时:
使用的是STATICFILES_DIRS和app下的static中的静态文件,Django 有默认的对STATIC_URL路由能自动找到放在里面的静态文件。
2、在部署模式(Debug=False)时:
使用的是STATIC_ROOT中的静态文件,此时则没有了默认的对STATIC_URL的路由,需要自己在project的urls.py中写一个,将STATIC_URL开头的请求转发到STATIC_ROOT中进行查找。
还有一种方法是使用文件服务器如nginx来实现:
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /root/myproject/static;
}
————————————————
版权声明:本文为CSDN博主「光明小学王小雨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41475058/article/details/105856148
此时在应用中加载静态文件的话就只需要将STATIC_URL设为/static/。
2.1.1.4 特别注意在生产环境中,禁止开启DEBUG = True!
- 因为当网站出错误时,其他人能看到源代码,而且也不需要给用户看到这些错误信息。所以需要关掉DEBUG = True,即设置DEBUG = False。
2.1.2 DEBUG=False时:
- 即部署模式
- 如果设置了DEBUG = False,那么就必须设置settings.py中的ALLOWED_HOSTS
- ALLOWED_HOSTS:其他人只能通过这个变量中的ip地址或者域名来进行访问,可以设置为IP或域名,也可以设置为允许所有的访问(*)。
2.1.3 总结
平时写代码的时候还是直接使用开发模式方便排查错误,当要部署到服务器时再改成部署模式。
2.1.3.1 当改为部署模式(Debug=False)时需要注意几个步骤:
1、修改setting.py中的DEBUG和ALLOWED_HOSTS:
DEBUG = False
ALLOWED_HOSTS = ['*'] # 真正上线部署的时候不建议填成通配符的*,而是要填允许访问的主机域名。
2、修改静态文件配置:
- STATIC_URL不用修改就使用默认的
- STATIC_ROOT的路径直接使用了根目录下的static,但是STATIC_ROOT的地址不能与STATICFILES_DIRS中的地址相同的,在部署模式的时候就先注释掉STATICFILES_DIRS中有冲突的地址。
STATIC_URL = '/static/'
# STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
# 指定收集静态文件的路径
STATIC_ROOT = 'var/www/dailyfresh/static'
3、project的urls.py添加静态文件路由:
因为在部署模式下默认是没有给静态文件做路由。
# dailyfresh/dailyfresh/urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf import settings # debug=False
from django.views import static # debug=False
from django.conf.urls import url # debug=False
urlpatterns = [
path('admin/', admin.site.urls),
path('tinymce/', include('tinymce.urls')), # 富文本编辑器
path('search/', include('haystack.urls')), # 全文检索框架
path('user/', include('user.urls', namespace='user')), # 用户模块
path('cart/', include('cart.urls', namespace='cart')), # 购物车模块
path('order/', include('order.urls', namespace='order')), # 订单模块
path('', include('goods.urls', namespace='goods')), # 商品模块
url(r'^static/(?P<path>.*)$', static.serve,
{'document_root': settings.STATIC_ROOT}, name='static'), # debug=False
]
【部分内容参考自】
- Python实现调用另一个路径下py文件中的函数方法总结:http://www.zzvips.com/article/143382.html
- 天天生鲜Django项目①:https://blog.csdn.net/weixin_43746433/article/details/104079674?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242
- Django中DEBUG模式及static静态文件:https://blog.csdn.net/qq_41475058/article/details/105856148