在nginx+uwsgi的部署中發現部署的過程,會有不少時候出現502的錯誤,或者直接程序死了,到如今,學習一個nginx+gunicorn的部署,html
咱們拿到新的服務器對的時候,應該先更新下服務器:python
$ sudo yum update
其次咱們應該建立一個用戶,用來部署,在Centos下建立用戶:mysql
$ adduser jummy #這裏是輸入用戶名,jummy能夠換成本身喜歡的用戶名
$ passwd jummy # 這裏是輸入密碼
---------受權--------------
$ chmod -v u+w /etc/sudoers
$ vim /etc/sudoers
咱們在這個sudoers
的文件下咱們找到root那行:nginx
# /etc/sudoers
···
root ALL=(ALL) ALL
jummy ALL=(ALL) ALL # 這是新添加的用戶須要本身寫
保存退出後,應該收回這個權限chmod -v u-w /etc/sudoers
git
$ su jummy
$ sudo cat /etc/sudoers
$ 輸入密碼,這裏照輸入,由於密碼看不見的,因此你看到是空白,但其實輸入對確認就能夠了
這樣咱們就新建立用戶完畢,能夠去配置環境了redis
我是在centos7下的,裝了python3.6,和虛擬環境,虛擬環境的做用想必學py的人都知道他的用處,若是不會能夠在 Centos下安裝pyenv和virtualenvwrappersql
$ mkdir workspace
$ pip instlall virtualenv
$ virtualenv typeidea
$ source typeidea/bin/activate
咱們先建一個文件夾來裝咱們的虛擬環境,而後在建立一個名爲typeidea
的虛擬環境(你的名字能夠跟我不同),而後咱們進入到咱們的環境當中django
把咱們寫的代碼放到服務器,大家能夠選擇用FileZilla傳輸過去,也能夠用Git,這裏爲了裝B一下,我仍是用Git
去傳輸,若是對Git
不熟悉能夠看Git的使用操做vim
$ cd
$ mkdir typeidea
$ cd typeidea
$ git clone 你的倉庫地址
通常咱們的項目在上傳到服務器時,會打包一份requirements.txt
的文件,這是用於加載咱們在開發階段所用到包,以及版本,爲了不在部署的時候版本不同,而致使的問題,咱們一般會先生成個txt
的文件,因此在你的開發環境中,進入虛擬環境,在你的項目根目錄執行以下:centos
$ pip freeze > requirements.txt
生成完成後,能夠去看我寫的Git
操做,把項目上傳到GitHub上,或者本身搭建的Git
服務器,在切到服務器中Git
下來,進入到服務器的虛擬環境,去到requirements.txt
的路徑下
$ pip install -r requirements.txt
系統會自動幫你安裝依賴
這兩個是咱們用的最多的插件,mysql
的安裝在個人簡書上會有一個詳細的安裝過程,但那是5.6的若是是其餘的,請本身去問問搜索引擎,這裏不詳細介紹,mysql5.6安裝,下面是redis的安裝以下
$ wget http://download.redis.io/releases/redis-4.0.9.tar.gz
$ tar xzf redis-4.0.9.tar.gz
$ cd redis-4.0.9
$ make
若是其餘配置須要本身去設置先,暫時個人博客是用了這兩個插件
這裏咱們能夠先直接啓動下項目python manage.py runserver
,看下是否能正常啓動仍是說少了安裝包什麼的,若是少了,能夠經過pip
去安裝一波,啓動成功後Ctrl+c
結束掉。在settings.py
中咱們先看看有沒有設置靜態文件收集在哪裏的語句,若是沒,就加上
$ vim settings.py
ALLOWED_HOSTS = ['*'] # 能夠配置爲你的域名或者公網IP,寫*是匹配所有均可以
···
THEME = 'themes/default'
STATIC_URL = '/static/'
STATIC_ROOT = '../static_files/'
···
只要加入STATIC_ROOT
這個就好,後面的路徑請本身選擇,我這裏是放在了上一層目錄當中,由於個人項目路徑是,一個typeidea
,裏面纔是django
的項目,咱們收集靜態文件
$ cd typeidea
$ python manage.py collectstatic
到這裏咱們就能發現咱們的上一層目錄已經多了靜態資源的文件夾
# 在虛擬環境下
$ pip install gunicorn
根據gunicorn
的文檔咱們試下用gunicorn
啓動下項目,這裏的typeidea
換成本身的項目名。
$ gunicorn typeidea.wsgi:application -w 4 -b 0.0.0.0:8000
這裏簡單說明一下,-w
的參數是指啓動多少個線程,我這裏能夠啓動4個線程,這個根據本身的服務器大小,已經項目需求去啓動數目,通常4個線程夠用了。
-b
的參數是指明瞭啓動的端口,默認是127.0.0.1:8000
,這裏我是指明瞭監聽所有端口,這個能夠跟啓動django
的項目端口同樣,這樣咱們就能發現咱們的線程啓動了,也不會有錯誤,咱們把這個gunicorn扔到後臺去跑,或者進階去用supervisord.conf
去管理,這裏的typeidea
換成本身的項目名。
$ nohup gunicorn typeidea.wsgi:application -w 4 -b 0.0.0.0:8000 &
nginx
的 功能能夠說很強大,能作負載均衡,端口的分發,對靜態資源的處理等等,咱們先來一波下載nginx
$ sudo yum install nginx
下載好後,咱們直接運行命令啓動咱們的nginx
$ sudo service nginx start
這樣就能看到咱們熟悉的歡迎頁面了,咱們先來看看nginx的配置在去寫nginx
$ cd /etc/nginx
$ sudo cat nginx.conf
這個時候咱們就能看到在配置中有這樣的一句話,
include /etc/nginx/conf.d/*.conf;
這個意思是他啓動的時候會去讀取conf.d
下的配置文件,也就是咱們能夠在這個 /etc/nginx/con.d
目錄下去寫配置文件,操做以下
$ cd /etc/nginx/conf.d
$ sudo touch nginx.conf
$ sudo vim nginx.conf
配置文件的內容以下:
# /etc/nginx/conf.d/nginx.conf
server {
listen 80;
root /home/jummy/workspace/typeidea-env/; #配置虛擬環境的目錄
access_log /home/jummy/workspace/typeidea/log/access_log; #配置這個log文件夾
error_log /home/jummy/workspace/typeidea/log/error_log; #配置這個log文件夾
server_name www.jummy.top; # 配置域名
#處理靜態文件 /favicon.ico:
location /favicon.ico {
alias /home/jummy/typeidea/static_files/favicon.ico; # 若是沒,不用配置
}
#處理django的靜態文件
location /static/ {
alias /home/jummy/typeidea/static_files/; # 收集靜態資源的路徑
}
#處理請求轉發8000接口 若是你的gunicorn是其餘端口,請本身改
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
這樣咱們的nginx配置文件就能寫完了,可是若是你重啓的話,會發現一個問題,那就是權限,你會發現你啓動的文件,於你的配置文件權限不同,這會致使你沒法啓動,或者是其餘問題,咱們返回以前的/etc/nginx
的目錄之下,把下面的用戶名改成本身的用戶名字,就能夠了:
# /etc/nginx/nginx.conf
···
user jummy
···
固然寫完nginx
的時候咱們能夠進入到本身寫的配置路徑下面,執行nginx -t
看下所運行的狀態,或者第幾行發生到錯誤。而後咱們就能夠啓動nginx,在瀏覽器輸入本身的IP或者域名就成功
ps:1.若是發現啓動仍是沒法訪問,首先檢查一下防火牆,防火牆要開80端口,不會開能夠看這編Linux上防火牆的設置
2.去本身的服務器廠家的控制檯,查看本身是否放通了安全組,通常要放通80,若是要調試能夠順便把8000端口也放通,固然取決於本身實際需求
3.檢查本身的nginx
的靜態路徑,反響代理的端口和IP,以及文件的權限問題
4.以上機器是在阿里雲,騰訊雲的Centos7.2的服務器上測試,均部署成功,若有問題,請留言,謝謝大佬們
若是有問題,能夠在下方留言,或者發郵件到a929440925@gmail.com,我會把我所知的幫大家解答,若有很差的地方,也能夠留言說說,謝謝你們,轉載請說明出處,謝謝
若是想要用Supervisrcrd
去管理,能夠看這編文章Supervisrcrd