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

一、下載項目html

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

二、進入Myblogs目錄mysql

cd MyBlogslinux

三、建立虛擬環境而且安裝依賴nginx

pipenv installgit

四、搭建mysql環境,以及建立數據庫和用戶github

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;  # 刷新

五、修改代碼,符合本身的需求web

修改settings/production.py文件redis

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中的郵箱配置,數據庫配置等。sql

六、將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郵箱官網獲取

七、配置好以後生成表結構

python manage.py makemigrations
python manage.py migrate

八、生成緩存表,而且收集靜態資源

python3 manage.py createcachetable # 生成緩存表
python3 manage.py collectstatic # 收集靜態資源

九、給mysql配置時區信息,默認爲空

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

十、第一階段測試

[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訪問若是成功就表示第一階段配置完成。

 十一、安裝uwsgi

pip3 install uwsgi

十二、配置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參數詳解

1三、配置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;
    #    }
    #}

}

1四、啓動redis

redis-server

1五、啓動uwsgi

uwsgi -i uwsgi.ini

當uwsgi啓動時若是想要中止能夠執行下面代碼

uwsgi --stop master.pid

# master.pid 爲 uwsgi.ini文件中pidfile指定的文件

1六、nginx的啓動

啓動:nginx

若是中止,能夠pkill nginx,而後再啓動nginx

1七、這下就完成了。其餘的能夠參考個人另外一篇文章

相關文章
相關標籤/搜索