nginx+uwsgi+python3+pipenv+mysql+redis部署django程序
阿新 • • 發佈:2019-01-05
rpm -ivh app types fig leg ons 位置 指定 you
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 = [‘production.py*‘] # 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‘, ‘[email protected]‘), ] # 郵件相關配置,用來發郵件 EMAIL_BACKEND = ‘django.core.mail.backends.smtp.EmailBackend‘ EMAIL_HOST = ‘smtp.qq.com‘ EMAIL_PORT = 465 EMAIL_HOST_USER = ‘[email protected]‘ # 這裏部署的時候改成自己的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<[email protected]>‘ # 日誌配置 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中的郵箱配置,數據庫配置等。
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、這下就完成了。其他的可以參考我的另一篇文章
nginx+uwsgi+python3+pipenv+mysql+redis部署django程序