服務(wù)器搭建過程記錄 Nginx + uwsgi + Django
本文進(jìn)行的前提:
在本地已完成Django項(xiàng)目調(diào)試,然后向服務(wù)器遷移
花了一天時(shí)間踩坑完成,可以參考一下流程
第一步 Django已完成項(xiàng)目 設(shè)置修改
-
settings.py 文件的修改
//settings.py DEBUG = False ALLOWED_HOSTS = ['*'] # STATICFILES_DIRS 是在開發(fā)過程中 使用django自帶服務(wù)器時(shí) 設(shè)置的靜態(tài)文件路徑 # STATIC_ROOT 這個(gè)路徑是 執(zhí)行 ./manage.py collectstatic (將每個(gè)app中靜態(tài)文件匯總) 后 那些靜態(tài)文件放的路徑 # 當(dāng)放到nginx服務(wù)器上時(shí) 保留STATIC_ROOT路徑 以方便以后修改 STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') # STATICFILES_DIRS = [ # os.path.join(BASE_DIR, 'static') # ] 在與manage.py同級(jí)目錄下 創(chuàng)建project.conf 文件
-
在配置前 先看下原理
#首先客戶端請(qǐng)求服務(wù)資源, #nginx作為直接對(duì)外的服務(wù)接口,接收到客戶端發(fā)送過來的http請(qǐng)求,會(huì)解包、分析, #如果是靜態(tài)文件請(qǐng)求就根據(jù)nginx配置的靜態(tài)文件目錄,返回請(qǐng)求的資源, #如果是動(dòng)態(tài)的請(qǐng)求,nginx就通過配置文件,將請(qǐng)求傳遞給uWSGI;uWSGI 將接收到的包進(jìn)行處理,并轉(zhuǎn)發(fā)給 wsgi, #wsgi根據(jù)請(qǐng)求調(diào)用django工程的某個(gè)文件或函數(shù),處理完后django將返回值交給wsgi, #wsgi將返回值進(jìn)行打包,轉(zhuǎn)發(fā)給uWSGI, #uWSGI接收后轉(zhuǎn)發(fā)給nginx,nginx最終將返回值返回給客戶端(如瀏覽器)。 #*注:不同的組件之間傳遞信息涉及到數(shù)據(jù)格式和協(xié)議的轉(zhuǎn)換# project.conf user www-data; worker_processes auto; pid /run/nginx.pid; events { worker_connections 768; # multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; gzip_disable "msie6"; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; # 以下需配置 server { listen 80; server_name www.19950314nina.top; # 你的服務(wù)器的域名地址 charset UTF-8; access_log /var/log/nginx/myweb_access.log; error_log /var/log/nginx/myweb_error.log; client_max_body_size 75M; #如果是動(dòng)態(tài)的請(qǐng)求,nginx將請(qǐng)求傳遞給uWSGI;uWSGI將接收到的包進(jìn)行處理,并轉(zhuǎn)發(fā)wsgi, location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; # 注意 這個(gè)8000端口需要和后面的 uwsgi.ini 端口一致 uwsgi_read_timeout 10; # 時(shí)間建議可以長一些 否則有時(shí)會(huì)返回504 } #如果是靜態(tài)文件請(qǐng)求 根據(jù)nginx配置的靜態(tài)文件目錄,返回請(qǐng)求的資源, location /static { expires 30d; autoindex on; add_header Cache-Control private; alias /home/mrg/PycharmProjects/myblog/static/; # 你的靜態(tài)文件路徑 即之前在setting.py 設(shè)置的 STATIC_ROOT 的路徑 } } }
-
在與manage.py同級(jí)目錄下 創(chuàng)建projectname_uwsgi.ini文件
[uwsgi] socket = :8000 # 注意 需要和nginx的配置文件端口一致 chdir=/home/mrg/PycharmProjects/myblog # django項(xiàng)目目錄絕對(duì)路徑 module= myblog.wsgi # wsgi.py在項(xiàng)目中的相對(duì)路徑 master = true processes=2 threads=2 max-requests=2000 chmod-socket=664 vacuum=true daemonize = /home/mrg/PycharmProjects/myblog/uwsgi.log # uwsgi日志存儲(chǔ)路徑 可以不寫#簡易版本 [uwsgi] socket= :8000 chdir = /home/mrg/PycharmProjects/myblog #django項(xiàng)目目錄絕對(duì)路徑 module = myblog.wsgi master = true processes = 4 vacumm = true -
最后
- 去nginx配置文件的根目錄拷貝mime.types(/etc/nginx/mime.types),以及uwsgi_params復(fù)制到工程目錄和project.conf放在一起。
第二步 使用git
對(duì)我來說 使用git 比較方便
也可以選擇其他方式上傳文件到服務(wù)器
Github創(chuàng)建一個(gè)空倉庫
-
在項(xiàng)目目錄下執(zhí)行以下步驟
git init #初始化項(xiàng)目 git remote add origin 遠(yuǎn)程倉庫地址 # 鏈接遠(yuǎn)程倉庫 source ~/env/bin/activate # 進(jìn)入虛擬環(huán)境 這個(gè)是寫django項(xiàng)目的環(huán)境 pip freeze > requirements.txt # 生成依賴文件 git add . # 添加代碼文件 git commit -m '初始版本' #代碼提交到本地庫 git push origin master # 代碼推送到倉庫如果出現(xiàn)代碼沖突情況
#如果希望保留生產(chǎn)服務(wù)器上所做的改動(dòng),僅僅并入新配置項(xiàng), 處理方法如下: git stash git pull git stash pop #如果希望用代碼庫中的文件完全覆蓋本地工作版本. 方法如下: git reset --hard git pull -
使用ubuntu自帶的ssh 工具登陸 服務(wù)器
ssh username@10.31.125.165順利連上之后 創(chuàng)建用戶(如果已經(jīng)有了就不需要重復(fù)了)
# 在 root 用戶下運(yùn)行這條命令創(chuàng)建一個(gè)新用戶,mrg 是用戶名 # 選擇一個(gè)你喜歡的用戶名,不一定非得和我的相同 root@localhost:~# useradd -m -s /bin/bash mrg # 把新創(chuàng)建的用戶加入超級(jí)權(quán)限組 root@localhost:~# usermod -a -G sudo mrg # 為新用戶設(shè)置密碼 # 注意在輸密碼的時(shí)候不會(huì)有字符顯示,不要以為鍵盤壞了,正常輸入即可 root@localhost:~# passwd mrg # 切換到創(chuàng)建的新用戶 root@localhost:~# su mrg # 切換成功,@符號(hào)前面已經(jīng)是新用戶名而不是 root 了 mrg@localhost:~$
第三步 環(huán)境配置
- 安裝常見的庫
- sudo apt-get update
- sudo apt-get upgrade
- sudo apt-get install man gcc make sudo lsof ssh openssl tree vim dnsutils iputils-ping net-tools psmisc sysstat curl telnet traceroute wget libbz2-dev libpcre3 libpcre3-dev libreadline-dev libsqlite3-dev libssl-dev zlib1g-dev git mysql-server mysql-client zip p7zip mycli
-
創(chuàng)建虛擬環(huán)境
- sudo apt-get python3-pip - sudo pip3 install virtualenv - sudo virtualenv -p python3 env_name 創(chuàng)建虛擬環(huán)境 - source ~/env_name/bin/active 開啟虛擬環(huán)境 - pip install uwsgi 安裝uwsgi - deactivate 退出虛擬環(huán)境 - sudo ufw allow 80 開啟80端口 -
mysql數(shù)據(jù)庫修改字符集
修改mysql的配置文件 cd /etc/mysql/mysql.conf.d sudo cp mysql.cnf mysql.cnf.bak sudo vim mysql.cnf 在[mysqld]下增加一句: character_set_server = utf8 保存并重啟服務(wù) sudo systemctl restart mysql.service #重啟服務(wù) -
安裝Nginx
sudo apt-get install nginx #安裝 sudo /etc/init.d/nginx start[or stop or restart] #啟動(dòng),關(guān)閉,重啟 從git倉庫拉代碼
git clone 倉庫地址 # 將項(xiàng)目clone下來
# cd 到項(xiàng)目根目錄
source ~/env/bin/activate # 進(jìn)入虛擬環(huán)境 這個(gè)就是之前創(chuàng)建的虛擬環(huán)境
pip install -r requirements.txt # 安裝依賴環(huán)境
第四步 一些設(shè)置的確認(rèn)及修改
-
數(shù)據(jù)庫的一些操作
# 創(chuàng)建用戶 grant all on *.* to 'django'@'%' identified by 'djangopwd'; # 刷新使用戶生效 flush privileges; # 創(chuàng)建對(duì)應(yīng)的表 create database project -
django數(shù)據(jù)庫遷移,以及靜態(tài)文件夾的生成
#cd到項(xiàng)目目錄下 ./manage.py makemigrations # 生成遷移文件 ./manage.py migrate # 遷移 ./manage.py collectstatic # 生成靜態(tài)文件夾 -
確認(rèn)項(xiàng)目目錄下配置文件中的路徑是否和服務(wù)器上對(duì)應(yīng)的路徑一致
-
主要為以下需要確認(rèn)的配置文件
1.settings.py 2.project.conf alias /home/mrg/PycharmProjects/myblog/static/; # 你的靜態(tài)文件路徑 即之前在setting.py 設(shè)置的 STATIC_ROOT 的路徑 3.projectname_uwsgi.ini chdir=/home/mrg/PycharmProjects/myblog # django項(xiàng)目目錄絕對(duì)路徑 主要是2,3 兩個(gè)文件中的路徑是否設(shè)置正確
-
-
確認(rèn)無誤后
# cd 到項(xiàng)目目錄下 uwsgi --ini project_uwsgi.ini nginx -c /home/mrg/PycharmProjects/myblog/project.conf # 注意該路徑必須為絕對(duì)路徑
到這里基本上已經(jīng)配置完成了,你也可以在網(wǎng)頁上打開你的頁面了
-----------------------------------------------------------------------------------------------------------------------------
- 如果啟動(dòng)時(shí)就報(bào)錯(cuò),查看終端信息,解決錯(cuò)誤。
如果終端沒有報(bào)錯(cuò),但是瀏覽時(shí)出現(xiàn)500、502等錯(cuò)誤,就去項(xiàng)目目錄查看nginx日志和uWSGI日志,解決錯(cuò)誤。 - 在本文中,使用了virtualenv開發(fā)環(huán)境,但只是用單獨(dú)的一個(gè)conf文件,在nginx上部署了一個(gè)工程,沒有說明部署多個(gè)工程的問題,也沒有說明使用supervisor來管理進(jìn)程等。請(qǐng)根據(jù)個(gè)人愛好和需要去實(shí)踐擴(kuò)展。
后記
獻(xiàn)給和我一樣懵懂中不斷汲取知識(shí),進(jìn)步的人們。
霓虹閃爍,但人們真正需要的,只是一個(gè)可以照亮前路的燭光
參考博客:
https://blog.csdn.net/c465869935/article/details/53242126