平台url:http://129.28.187.64
花巨资搞了个云服务器,预计 2019.06.27 到期,哈哈,有想体验指导的大佬私聊我~~~
部署环境
云服务器:Ubuntu Server 16.04.1 LTS 64位
python 主要包版本:
python 3.5.2 Django 2.0.3 BeautifulReport 0.0.9 celery 3.1.25 celery-with-redis 3.0 colorlog 4.0.2 crypto 1.4.1 ddt 1.2.1 django-celery 3.2.2 django-redis 4.0.0 gevent 1.4.0 greenlet 0.4.15 gunicorn 19.9.0 ipython 7.5.0 matplotlib 3.0.0 Pillow 6.0.0 pip 19.1.1 pycrypto 2.6.1 PyMySQL 0.9.3 qrcode 6.1 redis 2.10.6 requests 2.22.0
问题
1.为什么使用python3.5?
ubuntu使用python3.6在按照uwsgi的时候,老是报错,然后还么有找到原因...
2.定时任务运行报错:
1>.TypeError: can only concatenate tuple (not "NoneType") to tuple;
版本问题 需要 django-celery 3.1.17 celery 3.1.25 celery-with-redis 3.0; https://github.com/stanleylst/ansibleUI/issues/2
2>.TypeError: __init__() missing 1 required positional argument: ‘on_delete‘;
django2.0 on_delete 是必须的 ; https://blog.csdn.net/qq_38038143/article/details/80286187
3>.AttributeError: type object ‘BaseCommand‘ has no attribute ‘option_list‘;
升级django-celery 到3.2.2 解决 ; https://chowyi.com/Django-1-10-celery-worker-%E5%90%AF%E5%8A%A8%E6%8A%A5%E9%94%99/
3.django2.2/mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3;
django版本问题,降级到diango 2.2 往下就可以了;
4. You need tcl 8.5 or newer in order to run the Redis test.
安装redis时报的错,升级tcl即可; https://www.cnblogs.com/Security-Darren/p/4381932.html
5.nginx负载均衡设置时,命名不能用下划线;
upstream myApp {
server 127.0.0.1:9000;
}
6.BeautifulReport模块;
result.report(filename=now + ‘report.html‘, description=readConfig.title, log_path=report_path);
log_path 参数需要替换成 report_dir 参数
7.redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error;
redis-cli 输入 config set stop-writes-on-bgsave-error no https://www.jianshu.com/p/3aaf21dd34d6
8.locust 守护进程; 要带小括号 (locust -f base/performance.py --master &) https://www.cnblogs.com/maoxianfei/p/7987217.html
启动slave 运行性能测试 locust -f base/performance.py --slave --master-host=129.28.187.64
9.定时任务守护进程 django-celery supervisor http://yshblog.com/blog/165
supervisord.conf
[program:celery.worker] ;指定运行目录 directory=/home/ubuntu/EasyTest/ ;运行目录下执行命令 command=python manage.py celery worker --loglevel=info --logfile /home/ubuntu/EasyTest/celery_logs/celery_worker.log ;启动设置 numprocs=1 ;进程数 autostart=true ;当supervisor启动时,程序将会自动启动 autorestart=true ;自动重启 ;停止信号,默认TERM ;中断:INT (类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐) ;终止:TERM (kill -TERM pid) ;挂起:HUP (kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同 ;从容停止:QUIT (kill -QUIT pid) stopsignal=INT ;输出日志 stdout_logfile=/home/ubuntu/EasyTest/celery_logs/celery_worker.log stdout_logfile_maxbytes=10MB ;默认最大50M stdout_logfile_backups=10 ;日志文件备份数,默认为10 ;错误日志 redirect_stderr=false ;为true表示禁止监听错误 stderr_logfile=/home/ubuntu/EasyTest/celery_logs/celery_worker_err.log stderr_logfile_maxbytes=10MB stderr_logfile_backups=10 [program:celery.beat] ;指定运行目录 directory=/home/ubuntu/EasyTest/ ;运行目录下执行命令 command=celery -A EasyTest beat -l info --loglevel info --logfile /home/ubuntu/EasyTest/celery_logs/celery_beat.log ;启动设置 numprocs=1 ;进程数 autostart=true ;当supervisor启动时,程序将会自动启动 autorestart=true ;自动重启 ;停止信号 stopsignal=INT
启动和关闭supervisor
启动supervisor输入如下命令,使用具体的配置文件执行:
supervisord -c supervisord.conf
关闭supervisord需要通过supervisor的控制器:
supervisorctl -c supervisord.conf shutdown
重启supervisord也是通过supervisor的控制器:
supervisorctl -c supervisord.conf reload
10.django 匿名用户限制;
装饰器 @login_required
11.异常页面配置 400 403 404 500 https://zhuanlan.zhihu.com/p/38006919
12.gunicorn配置;
启动命令:gunicorn -c gunicorn-config.py EasyTest.wsgi:application
gunicorn-config.py
# !/usr/bin/env python # coding=utf-8 from multiprocessing import cpu_count bind = ‘127.0.0.1:9000‘ daemon = True # 守护进程 workers = cpu_count() * 2 worker_class = ‘gevent‘ forwarded_allow_ips = ‘*‘ # 维持TCP链接 keepalive = 6 timeout = 65 graceful_timeout = 10 worker_connections = 65535 # log capture_output = True loglevel = ‘info‘ accesslog = "/tmp/EasyTest_access.log" #访问日志文件的路径 errorlog = "/tmp/EasyTest_error.log"
13.nginx配置;
nginx启动命令:sudo /usr/local/nginx/sbin/nginx
nginx.conf
#user nobody; worker_processes 4; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; pid logs/nginx.pid; worker_rlimit_nofile 65535; events { use epoll; multi_accept on; worker_connections 10240; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 128k; log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ ‘$status $body_bytes_sent "$http_referer" ‘ ‘"$http_user_agent" "$http_x_forwarded_for"‘; #access_log logs/access.log main; # keepalive_timeout 0; gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; upstream myApp { server 127.0.0.1:9000; } server { listen 80 ; server_name 129.28.187.64; #charset koi8-r; charset utf-8; access_log /home/ubuntu/EasyTest/logs/access.log main; error_log /home/ubuntu/EasyTest/logs/error.log; location = /favicon.ico { empty_gif; access_log off; } location /media/ { root /home/ubuntu/EasyTest/; expires 30d; access_log off; } location /static/ { alias /var/static/static/; } location / { root html; index index.html index.htm; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; proxy_redirect off; proxy_pass http://myApp; } } }