• nginx+uwsgi+python3+pipenv+mysql+redis部署django程序


    1、下载项目

    git clone https://github.com/wangyitao/MyBlogs.git

    2、进入Myblogs目录

    cd MyBlogs

    3、创建虚拟环境并且安装依赖

    pipenv install

    4、搭建mysql环境,以及创建数据库和用户

    wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm  # 下载rpm源
    rpm -ivh mysql80-community-release-el7-1.noarch.rpm  # 添加rpm源到系统
    yum update  # 更新源,替换掉原来的源
    yum install mysql-server # 安装mysql
    service mysqld start # 启动mysql
    service mysqld status  # 查看mysql是否启动
    grep 'temporary password' /var/log/mysqld.log  # 查找mysql给我们设置的初始密码
    mysql -uroot -p  # 登录mysql,密码输入上面查到的初始密码
    ALTER USER 'root'@'localhost' IDENTIFIED BY '密码';(注意要切换到mysql数据库,使用use mysql)修改root密码
    flush privileges;  # 直接生效修改之后的密码,不用重启mysql
    CREATE DATABASE myblogs DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;   # 创建一张给网站用的表,表名自定,我的叫myblogs
    CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码!';  # 创建新用户来管理这个网站
    GRANT ALL PRIVILEGES ON myblogs.* TO '用户名'@'localhost'; # 给用户创建操作表的权限
    FLUSH PRIVILEGES;  # 刷新

    5、修改代码,符合自己的需求

    修改settings/production.py文件

    from .base import *
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = os.environ['SECRET_KEY']  # 从环境变量中读取,增加安全性
    
    # SECURITY WARNING: don't run with debug turned on in production!2.
    DEBUG = False
    
    ALLOWED_HOSTS = ['*']
    
    # Database
    # https://docs.djangoproject.com/en/2.1/ref/settings/#databases
    DATABASE_PASSSWORD = os.environ['DATABASE_PASSSWORD']
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'myblogs',  # 要连接的数据库,连接前需要创建好
            'USER': 'root',  # 连接数据库的用户名
            'PASSWORD': DATABASE_PASSSWORD,  # 连接数据库的密码
            'HOST': '127.0.0.1',  # 连接主机,默认本级
            'PORT': 3306  # 端口 默认3306
        }
    }
    
    ADMINS = [  # 配置管理员,出错发送给管理员
        ('felix', 'felix@example.com'),
    ]
    # 邮件相关配置,用来发邮件
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = 'smtp.qq.com'
    EMAIL_PORT = 465
    EMAIL_HOST_USER = '1403179190@qq.com' # 这里部署的时候改成自己的qq邮箱
    EMAIL_HOST_PASSWORD = os.environ['EMAIL_HOST_PASSWORD']  # 授权码
    EMAIL_SUBJECT_PREFIX = u'[FCBlog]'
    EMAIL_USE_SSL = True  # 与SMTP服务器通信时,是否启动TLS链接(安全链接)
    EMAIL_TIMEOUT = 60
    FROM_EMAIL = 'FCBlog<1403179190@qq.com>'
    
    # 日志配置
    LOGGING_FILE_PATH = os.environ['LOGGING_FILE_PATH']  # 配置日志文件位置
    # 日志文件
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'file': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',
                'filename': LOGGING_FILE_PATH,
            },
            'mail_admins': {  # 出错发送邮件给管理员
                'level': 'ERROR',
                'class': 'django.utils.log.AdminEmailHandler',
            },
        },
        'loggers': {
            'django': {
                'handlers': ['file'],
                'level': 'DEBUG',
                'propagate': True,
            },
            'django.request': {
                'handlers': ['mail_admins'],
                'level': 'ERROR',
                'propagate': False,
            },
        },
    }
    
    # 配置django的session引擎改成redis
    SESSION_ENGINE = 'redis_sessions.session'
    # redis服务器地址
    SESSION_REDIS_HOST = 'localhost'
    # redis端口
    SESSION_REDIS_PORT = 6379
    # 选择那个redis库
    SESSION_REDIS_DB = 2
    # 密码
    SESSION_REDIS_PASSWORD = ''
    # 前缀的键名
    SESSION_REDIS_PREFIX = 'myblogs_django_session'
    production.py

    修改production.py中的邮箱配置,数据库配置等。

    6、将production.py中需要从环境变量读取的数据写入环境变量,在/etc/profile下添加如下信息。

    # django关键信息变量
    export SECRET_KEY="" # 写入自己的django的secret_key
    export DATABASE_PASSSWORD="" # 写入自己的数据库密码
    export EMAIL_HOST_PASSWORD=""  # 写入自己的qq邮箱的key
    export LOGGING_FILE_PATH="" # 写入自己的日志存放目录绝对路径 比如我的/home/myblogs_log/mylog.log

    a、django的SECRET_KEY重新生成方式如下:

    (MyBlogs) [root@localhost MyBlogs]# django-admin shell
    Python 3.7.2 (default, Jan  3 2019, 16:25:55) 
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> from django.core.management import utils
    >>> utils.get_random_secret_key()
    'yqk27s&bi(11te&8dgl=-r1&638re&)3bj=ozzb1h+72p-ra53'
    >>> 

    b、EMAIL_HOST_PASSWORD 可以从qq邮箱官网获取

    7、配置好之后生成表结构

    python manage.py makemigrations
    python manage.py migrate

    8、生成缓存表,并且收集静态资源

    python3 manage.py createcachetable # 生成缓存表
    python3 manage.py collectstatic # 收集静态资源

    9、给mysql配置时区信息,默认为空

    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p "密码" mysql

    10、第一阶段测试

    [root@localhost MyBlogs]# pipenv run python3 FCBlogs/manage.py runserver 0.0.0.0:80
    Performing system checks...
    
    System check identified no issues (0 silenced).
    January 04, 2019 - 22:30:52
    Django version 2.1.4, using settings 'myblog.settings.development'
    Starting development server at http://0.0.0.0:80/
    Quit the server with CONTROL-C.

    然后使用ip访问如果成功就表示第一阶段配置完成。

     11、安装uwsgi

    pip3 install uwsgi

    12、配置uwsgi启动文件

    新建一个uwsgi.ini文件,内容如下

    [uwsgi]
    chdir=/root/myblogs/MyBlogs/FCBlogs  
    home=/root/.local/share/virtualenvs/MyBlogs-7hihB8Gz/ 
    module=myblog.wsgi  
    master=true
    processes=4  
    socket=0.0.0.0:8001 
    vacuum=true
    max-requests=5000 
    enable-threads=true
    harakiri=20
    uid=1000
    pid=2000
    daemonize=/root/myblogs/MyBlogs/myblogs_uwsgi/myblogs.log
    pidfile=/root/myblogs/MyBlogs/myblogs_uwsgi/master.pid

     uwsgi参数详解

    master = true 
    #启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。
    
    chdir = /web/www/mysite 
    #在app加载前切换到当前目录, 指定运行目录
    
    module = mysite.wsgi 
    # 加载一个WSGI模块,这里加载mysite/wsgi.py这个模块
    
    py-autoreload=1  
    #监控python模块mtime来触发重载 (只在开发时使用)
    
    lazy-apps=true  
    #在每个worker而不是master中加载应用
    
    socket = /test/myapp.sock 
    #指定socket文件,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字
    
    processes = 2 #启动2个工作进程,生成指定数目的worker/进程
    
    buffer-size = 32768 
    #设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
    
    daemonize = /var/log/myapp_uwsgi.log 
    # 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
    
    log-maxsize = 5000000 #设置最大日志文件大小
    
    disable-logging = true #禁用请求日志记录
    
    vacuum = true #当服务器退出的时候自动删除unix socket文件和pid文件。
    
    listen = 120 #设置socket的监听队列大小(默认:100)
    
    pidfile = /var/run/uwsgi.pid #指定pid文件
    
    enable-threads = true 
    #允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
    
    reload-mercy = 8 
    #设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
    
    max-requests = 5000 
    #为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏
    
    limit-as = 256 
    #通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。
    
    harakiri = 60 
    #一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
    uwsgi参数详解

    13、配置nginx参数

    配置文件如下,nginx.conf

    user  root;
    worker_processes  1;
    
    error_log  logs/error.log;
    
    pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        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;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        # 支持图片 gif等等压缩,减少网络带宽
        gzip  on;
        
        server {
            listen      80;
            server_name myblog; # substitute your machine's IP address or FQDN
            charset     utf-8;
    
            client_max_body_size 75M;   # adjust to taste
    
            location /favicon.ico {
                alias /root/myblogs/MyBlogs/myicon.ico;
            }
    
            location /media  {
                alias /root/myblogs/MyBlogs/FCBlogs/media;  # your Django project's media files - amend as required
            }
    
            location /static {
                alias /root/myblogs/MyBlogs/FCBlogs/static_collection; # your Django project's static files - amend as required
            }
    
            location / {
                uwsgi_pass  0.0.0.0:8001;
                include     uwsgi_params; # the uwsgi_params file you installed
            }
        }
    
    
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }

    14、启动redis

    redis-server

    15、启动uwsgi

    uwsgi -i uwsgi.ini

    当uwsgi启动时如果想要停止可以执行下面代码

    uwsgi --stop master.pid
    
    # master.pid 为 uwsgi.ini文件中pidfile指定的文件

    16、nginx的启动

    启动:nginx
    
    如果停止,可以pkill nginx,然后再启动nginx

    17、这下就完成了。其他的可以参考我的另一篇文章

  • 相关阅读:
    关于Tomcat的那些事儿(一)
    关于Spring的问题(一)
    关于Spring的@RequestBody的使用
    关于Eclipse切换所有分支
    关于使用BetterIntelliJ激活IntelliJ IDEA
    关于Elasticsearch的问题(一)
    关于Elasticsearch那些事
    关于LRU算法及Java实现
    自定义滚动条
    创建型模式之建造者模式
  • 原文地址:https://www.cnblogs.com/felixwang2/p/10222735.html
Copyright © 2020-2023  润新知