服務(wù)器搭建過程記錄 Nginx + uwsgi + Django

服務(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)頁上打開你的頁面了

-----------------------------------------------------------------------------------------------------------------------------

  1. 如果啟動(dòng)時(shí)就報(bào)錯(cuò),查看終端信息,解決錯(cuò)誤。
    如果終端沒有報(bào)錯(cuò),但是瀏覽時(shí)出現(xiàn)500、502等錯(cuò)誤,就去項(xiàng)目目錄查看nginx日志和uWSGI日志,解決錯(cuò)誤。
  2. 在本文中,使用了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

https://www.cnblogs.com/fnng/p/5268633.html

https://www.zmrenwu.com/post/20/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容