不輕松,服務器部署nginx+uwsgi+djangorestfremework+react

      網友投稿 971 2025-04-03

      一、前言

      需要在阿里云服務器部署Django-restframework框架,一開始不清楚情況,網上找了很多的文章和辦法,東拼西湊也沒有能夠完全實現nginx和uwsgi的互通。

      參考過的文章有

      -視頻:Nginx + uWsgi 部署 Django + Mezzanine 生產服務器

      -文章:uWSGI+django+nginx的工作原理流程與部署歷程

      -文章:uwsgi官方文檔

      -文章:Django Nginx+uwsgi 安裝配置

      -文章:centos7 下通過nginx+uwsgi部署django應用

      二、網上文章的遺漏

      因為是東拼西湊,所以無論是網上的文章還是自己拼湊的配置,都是沒有辦法打通的。后來紅包求助,才了解到有這幾個地方:

      1、nginx執行權限

      2、uwsgi配置

      3、uwsgi設置虛擬環境

      4、uwsgi安裝問題及插件安裝問題

      5、django靜態文件收集處理

      6、

      三、部署安裝記錄

      1、創建非管理員賬戶

      由于安全需求,還是配置一個非管理員(自己操作,增加sudo授權)賬戶操作,通過命令創建用戶名密碼

      adduser?quinns??#?新增用戶?passwd?quinns??#?為quinns設置密碼?復制代碼

      設置好之后,還需要開啟sudo權限,通過命令:

      vi?/etc/sudoers?復制代碼

      然后找到有 root ALL=(ALL)那一行,然后在下面增加一行:

      quinns?ALL=(ALL)??ALL?復制代碼

      保存即可。

      下面的操作,用新用戶quinns登錄來操作。

      2、安裝依賴

      uwsgi和nginx以及anaconda的安裝會存在一些報錯問題,這里為了避免出現這情況,所以先安裝好依賴。

      sudo?yum?install?gcc-c++?sudo?yum?install?wget?openssl-devel?bzip2-devel?expat-devel?gdbm-devel?readline-devel?sqlite-devel?libxml*?pcre-devel?python-devel?bzip2?復制代碼

      3、安裝軟件

      通過quinns賬戶登錄,然后到quinns用戶目錄(/home/quinns)下新建一個utils目錄,把一些軟件下載在utils目錄下。

      通過wget方式下載anaconda(官網)

      wget?https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh?復制代碼

      如果想更快,就安裝國內源(清華鏡像):

      wget?https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.1.0-Linux-x86_64.sh?復制代碼

      下載好之后sh安裝

      sh?Anaconda3-5.0.1-Linux-x86_64.sh?復制代碼

      一路默認,到之后面安裝完的時候會提示是否添加環境變量,輸入yes即可。

      如果想要后面使用更快,可以更改倉庫鏡像(我沒試過):

      conda?config?--add?channels?https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/?conda?config?--add?channels?https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/?conda?config?--set?show_channel_urls?yes?復制代碼

      這樣的話安裝軟件都是國內源,速度比較快(聽說是)

      通過命令:

      conda?list?復制代碼

      來驗證是否成功安裝并加入環境變量,如果出現list列表則代表成功,如果出現報錯提示信息則需要用命令:

      source?~/.bashrc?復制代碼

      來添加,然后重復conda list命令。如果還是不行,則編輯/etc/profile文件,在底部添加環境變量及指向:

      export?PATH=/home/quinns/anaconda3/bin:$PATH?復制代碼

      通過文件添加的環境變量需重啟服務器才能生效 ?sudo reboot

      在確認安裝好anaconda之后,先不著急新建虛擬環境,直接在linux下輸入python,檢查默認python是否已自動替換為python3.6。接著通過pip安裝uwsgi:

      pip?install?uwsgi?復制代碼

      如果不成功則嘗試使用aliyun的源 阿里云的源我復制下來了,是:

      http://mirrors.aliyun.com/pypi/packages/a2/c9/a2d5737f63cd9df4317a4acc15d1ddf4952e28398601d8d7d706c16381e0/uwsgi-2.0.17.1.tar.gz?復制代碼

      待有安裝成功的提示出來,再通過命令:

      uwsgi?--version?復制代碼

      來確認是否成功安裝。

      通過anaconda來創建python虛擬環境:

      conda?create?--name?envname?python=3.6.3?(親身經歷?3.6.5無法啟動uwsgi,最好還是3.6.3)?復制代碼

      觀察過程,無報錯即完成安裝。

      直接通過yum來安裝nginx即可,如果想安裝新版,可以在網上尋找新方法。

      sudo?yum?install?nginx?復制代碼

      如果是centos7 ?是默認沒有Nginx源的,需要給它添加源,才能使用Yum install ?安裝

      sudo?rpm?-Uvh?http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm?復制代碼

      安裝完成后應該是自動啟動服務,在瀏覽器輸入ip即可訪問nginx的歡迎頁面。如果沒有,通過命令:

      sudo?service?nginx?start/restart?復制代碼

      來啟動或者重啟nginx服務。

      先下載mysql的repo源

      wget?http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm?復制代碼

      接著安裝mysql-community-release-el7-5.noarch.rpm包

      sudo?rpm?-ivh?mysql-community-release-el7-5.noarch.rpm?復制代碼

      安裝這個包后,會獲得兩個mysql的yum repo源:/etc/yum.repos.d/mysql-community.repo,/etc/yum.repos.d/mysql-community-source.repo。

      最后執行安裝

      sudo?yum?install?mysql-server?復制代碼

      先授權

      sudo?chown?-R?root:root?/var/lib/mysql?service?mysqld?restart??#?然后重啟?復制代碼

      接著重置密碼

      mysql?-u?root??//直接回車進入mysql控制臺?mysql?>?use?mysql;?mysql?>?update?user?set?password=password('quinns')?where?user='root';?mysql?>?exit;?service?mysqld?restart??#?然后再重啟一次服務?復制代碼

      重點:在實際的應用當中,我們一般不推薦使用root賬戶,而是新增用戶并對其進行授權。

      所以,這里我要加上刪除線

      mysql默認是不開啟遠程訪問的,想要在本地連接服務器的mysql,必須開啟:

      mysql -u root -p

      mysql> use mysql;

      mysql> update user set host = '%' where user = 'root';

      service mysqld restart ?# 這里也要重啟一次服務

      (過30秒或者1分鐘再測試遠程連接)如果不行的話,接著重啟服務一次。

      CREATE?USER?'username'@'host'?IDENTIFIED?BY?'password';?復制代碼

      命令含義說明:

      username:你將創建的用戶名?host:指定該用戶在哪個主機上可以登陸,如果是本地用戶可用localhost,如果想讓該用戶可以從任意遠程主機登陸,可以使用通配符%?password:該用戶的登陸密碼,密碼可以為空,如果為空則該用戶可以不需要密碼登陸服務器?復制代碼

      比如這里我可以把命令改成:

      CREATE?USER?'quinns'@'%'?IDENTIFIED?BY?'123456';?復制代碼

      意味著我新建了一個名為quinns且密碼為123456的用戶,并給它開啟了所有ip地址遠程連接(當然也可以指定某個ip)

      GRANT?privileges?ON?databasename.tablename?TO?'username'@'host'?復制代碼

      命令含義說明:

      privileges:用戶的操作權限,如SELECT,INSERT,UPDATE等,如果要授予所有則使用ALL?databasename:數據庫名?tablename:表名,如果要授予該用戶對所有數據庫和表的相應操作權限則可用*表示,如*.*?復制代碼

      授權命令示例:

      GRANT?SELECT,?INSERT?ON?test.user?TO?'pig'@'%';?GRANT?ALL?ON?*.*?TO?'pig'@'%';?GRANT?ALL?ON?maindataplus.*?TO?'pig'@'%';?復制代碼

      命令:

      SET?PASSWORD?FOR?'username'@'host'?=?PASSWORD('newpassword');?復制代碼

      如果是當前登陸用戶用:

      SET?PASSWORD?=?PASSWORD("newpassword");?復制代碼

      例子:

      SET?PASSWORD?FOR?'pig'@'%'?=?PASSWORD("123456");?復制代碼

      命令:

      REVOKE?privilege?ON?databasename.tablename?FROM?'username'@'host';?復制代碼

      說明:

      privilege,?databasename,?tablename:同授權部分?復制代碼

      例子:

      REVOKE?SELECT?ON?*.*?FROM?'pig'@'%';?復制代碼

      注意:

      假如你在給用戶'pig'@'%'授權的時候是這樣的(或類似的):GRANT?SELECT?ON?test.user?TO?'pig'@'%',則在使用REVOKE?SELECT?ON?*.*?FROM?'pig'@'%';命令并不能撤銷該用戶對test數據庫中user表的SELECT?操作。相反,如果授權使用的是GRANT?SELECT?ON?*.*?TO?'pig'@'%';則REVOKE?SELECT?ON?test.user?FROM?'pig'@'%';命令也不能撤銷該用戶對test數據庫中user表的Select權限。?復制代碼

      具體信息可以用命令

      SHOW?GRANTS?FOR?'pig'@'%';??復制代碼

      查看。

      命令:

      DROP?USER?'username'@'host';?復制代碼

      參考來源:傳送門

      四、uwsgi服務測試

      安裝好這些軟件后,需要確保獨立服務都是正常運行的。

      在/home/quinns目錄下新建wwwroot目錄,然后在里面新建一個測試文件uwsgitest.py

      def?application(env,?start_response):?????start_response('200?OK',?[('Content-Type','text/html')])?????return?[b"Hello?World,?This?uwsgi?server?is?running"]?復制代碼

      保存后通過命令來啟動

      uwsgi?--http?:8000?--wsgi-file?uwsgitest.py?復制代碼

      看到服務啟動后,就可以在瀏覽器訪問8080端口,如果能夠正常顯示文字內容,則代表uwsgi單獨服務是可以正常運行的。如果沒有,根據報錯找原因。

      五、上傳django-rest項目

      可以在本地,通過ssh對服務器進行連接,其中也包括上傳下載服務。

      本地打開終端后輸入:

      scp?-r?djangoName?quinns@47.98.212.01:/home/quinns/wwwroot?復制代碼

      將當前目錄的djangoName文件夾通過quinns賬戶上傳到/home/quinns/wwwroot目錄內。回車執行后輸入quinns的密碼即可看到上傳到指定的wwwroot目錄內。

      六、配置django

      本地開發環境下的django和服務器的設置有些許不一樣。

      首先要開放ALLOWED_HOSTS,使得程序可以遠程訪問,然后再設置靜態文件,最后再通過命令來測試是否可以順利啟動。

      找到django項目的settings.py文件,里面有個ALLOWED_HOSTS,是接收一個空列表,現在要將服務器地址或者域名添加進去(也可以放*號,代表所有都可以指向這里,但是不推薦這么做):

      ALLOWED_HOSTS?=?['47.98.209.107']?復制代碼

      上面就算是開啟了遠程訪問,接著設置靜態(drf有一些樣式,如果不設置,通過uwsgi啟動是無法加載的)。同樣是在settings.py文件中,下部分代碼中有個STATIC_URL = '/static/',在它下面新增一行:

      STATIC_ROOT?=?os.path.join(BASE_DIR,?"static/")?復制代碼

      保存文件,然后在虛擬環境下執行命令:

      python?manage.py?collectstatic?復制代碼

      這樣django就會收集靜態文件,放到指定目錄內,也就是(static目錄內)

      七、編寫uwsgi配置

      uwsgi可以通過命令來啟動django項目,也可以通過配置文件ini或者xml來啟動。這里已ini為例。

      在項目根目錄(manage.py同目錄,其實哪個目錄都可以,這里是方便尋找)新建文件夾conf,然后再在conf下新建uwsgi文件夾(這倆文件夾什么名字無所謂)。接著新建uwsgi的配置文件,這里暫且叫做lagou_uwsgi.ini ?里面寫上uwsgi與項目的配置信息:

      ite_uwsgi.ini?file`?????[uwsgi]?????#?Django-related?settings?????#?the?base?directory?(full?path)?????chdir???????????=?/home/quinns/wwwroot/GamesAPI?????#?Django's?wsgi?file?????module??????????=?GamesAPI.wsgi?????#?the?virtualenv?(full?path)?????#?process-related?settings?????#?master?????master??????????=?true?????#?maximum?number?of?worker?processes?????processes???????=?4?????threads?????????=?2?????#?the?socket?(use?the?full?path?to?be?safe?????socket??????????=?127.0.0.1:8001?????#?...?with?appropriate?permissions?-?may?be?needed?????#?chmod-socket????=?664?????#?clear?environment?on?exit?????vacuum??????????=?true???virtualenv?=?/home/quinns/anaconda3/envs/envgames?????python-autoreload=1?????logto?=?/home/quinns/wwwroot/GamesAPI/uwsgilog.log?????stats?=?%(chdir)/conf/uwsgi/uwsgi.status?????pidfile?=?%(chdir)/conf/uwsgi/uwsgi.pid?復制代碼

      具體的含義在uwsgi文檔都有,這里記錄一下:

      chdir?#?項目絕對路徑?module??#?項目內的uwsgi.py文件,其實與項目同名即可?master?processes?threads?socket?#?服務啟動地址及端口?vacuum?virtualenv?#?這個就很重要了,python虛擬環境地址?python-autoreload=1?#?python自啟動?logto?#?自動生成日志文件及存放路徑?stats?pidfile?復制代碼

      這就算是編寫好uwsgi的配置文件了,接著編寫nginx的配置。

      八、單項目nginx配置

      最好不要改動原有的ningx,來新建一個新的.conf配置文件吧。同樣在項目目錄的conf目錄內新建nginx文件夾,然后再在nginx文件夾里新建lagou.conf配置文件,里面寫上nginx的配置:

      upstream?games?{?#?server?unix:///path/to/your/mysite/mysite.sock;?#?for?a?file?socket?server?127.0.0.1:8001;?#?uwsgi的端口?}?#?configuration?of?the?server?error_log??/home/quinns/wwwroot/nginxerror.log;#錯誤日志?server?{?#?the?port?your?site?will?be?served?on?listen??????8080;?#?端口?server_name?47.98.209.107?;?#?服務器ip或者域名?charset?????utf-8;?#?max?upload?size?client_max_body_size?75M;???#?adjust?to?taste?#?Django?media?location?/media??{?????alias??/home/quinns/wwwroot/GamesAPI/media;??#?指向django的media目錄?}?#?Django?static?location?/static??{?????alias??/home/quinns/wwwroot/GamesAPI/static;??#?指向django的static目錄?}?#?Finally,?send?all?non-media?requests?to?the?Django?server.?location?/?{?????uwsgi_pass??games;?????include?????uwsgi_params;?#?uwsgi服務?}?}?復制代碼

      里面都有說明了,我就不寫了。其的upstream games中的games是自定義名稱,但是要與下面的uwsgi_pass ?games中games名稱相同。

      注意: .conf文件建立好后,要與讓nginx知道并承認,所以需要通過軟連接來鏈接到/etc/nginx/conf.d/目錄下,如果不知道軟連接怎么做,可以把這個文件copy到這個目錄下。

      然后重啟服務器

      sudo?service?nginx?restart???復制代碼

      有些版本的命令是:

      sudo?systemctl?restart?nginx.service?復制代碼

      如果沒有報錯,應該就是可以了。

      如果有報錯,沒有重啟ng服務器,那肯定是配置文件寫錯了,得去看一下。

      不輕松,服務器部署nginx+uwsgi+djangorestfremework+react

      九、啟動項目

      既然uwsgi也配置好了,django項目的虛擬環境也pip install -r requirements.txt過了,ng的配置文件也寫好了。那就可以啟動服務了。

      通過linux命令來進行啟停

      sudo?service?nginx?restart/start/stop?復制代碼

      如果之前啟動過,就不用重啟了。

      找到剛才編寫的lagou_uwsgi.ini配置文件目錄,通過命令來啟動:

      uwsgi?-i?lagou_uwsgi.ini?&?復制代碼

      如果沒有報錯,就代表啟動了。就可以在瀏覽器訪問之前.conf配置文件配置的8080端口了。

      意外的小問題

      后期部署發現,不同版本的Centos對權限的設定是不一樣的。

      比如:

      不能在自定義的nginx.conf文件中填寫erro_log的配置

      需要在/etc/nginx/nginx.conf里面將user改成root

      如果發現502 bad getway,就需要查看uwsgi日志和nginx日志,如果在nginx日志(默認/var/log/nginx/error.log)看到如下提示

      2018/08/19?21:06:37?[crit]?967#967:?*1?connect()?to?127.0.0.1:8001?failed?(13:?Permission?denied)?while?connecting?to?upstream,?client:?192.168.0.103,?server:?192.168.0.61,?request:?"GET?/?HTTP/1.1",?upstream:?"uwsgi://127.0.0.1:8001",?host:?"192.168.0.61:8080"?復制代碼

      就代表是權限方面的問題,經過網上文章搜索,找到原因SeLinux的導致的。

      解決辦法有兩種,比較直接的是運行命令:

      setsebool?-P?httpd_can_network_connect?1?復制代碼

      后來又產生新的問題,Django的靜態文件無法正常加載,nginx返回的是403.

      解決這種問題的辦法是通過配置文件,長期關閉SeLinux,怎么關:《煩人的linux權限問題-SeLinux》

      十、nginx配置靜態

      后端api沒有問題后,前端也要部署。

      前端通過npm run build打包之后,將build文件通過ssh上傳到wwwroot目錄下:

      scp?-r?build?quinns@xx.xx.xx.xx:/home/quinns/wwwroot?復制代碼

      等到上傳完成后,就到nginx那里進行靜態的部屬配置

      cd?/etc/nginx?復制代碼

      然后打開nginx.conf文件進行編輯。

      首先要給nginx文件進行訪問授權,否則有些目錄是會報錯403的。其配置文件中有:

      user?nginx;?復制代碼

      這里得給他改成用戶的權限,如quinns或者root

      user?quinns;?復制代碼

      看到server部分的代碼:

      server?{?listen???????80?default_server;?????????listen???????[::]:80?default_server;?????????server_name??_;?????????root?????????/usr/share/nginx/html;??????????????????#?Load?configuration?files?for?the?default?server?block.?????????include?/etc/nginx/default.d/*.conf;?????????location?/?{?#?配置這個,才能正確跳轉路由,如47.98.110.67/detail/1?????????????????add_header?Cache-Control?"no-cache,?no-store";?????????????????index?index.html;?????????????????try_files?$uri?/index.html;??????????}?……?????……?}?復制代碼

      是這樣的,訪問網址80端口默認指向/usr/share/nginx/html目錄下的index.html

      因為靜態打包后build也是由index.html來作為主入口的。所以這里只需要把root的指向改過來即可:

      server?{?listen???????80?default_server;?????????listen???????[::]:80?default_server;?????????server_name??_;?????????#root?????????/usr/share/nginx/html;?????????root??????????/home/quinns/wwwroot/build;?????????#?Load?configuration?files?for?the?default?server?block.?????????include?/etc/nginx/default.d/*.conf;?????????location?/?{?#?配置這個,才能正確跳轉路由,如47.98.110.67/detail/1?????????????????add_header?Cache-Control?"no-cache,?no-store";?????????????????index?index.html;?????????????????try_files?$uri?/index.html;??????????}?……?????……?}?復制代碼

      將原來的root指向注釋掉,增加build文件夾的指向

      然后重啟nginx服務,打開瀏覽器訪問,就可以看正常的頁面了。

      心中一陣竊喜,這個坑終于是填上了。

      HTTP Nginx React

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel表頭怎么設置(excel表頭怎么設置表頭三角)
      下一篇:excel表格a4橫向打印如何設置(a4紙表格橫向打印怎么設置)
      相關文章
      久久综合日韩亚洲精品色| 欧美日韩亚洲精品| 亚洲永久无码3D动漫一区| 亚洲精品成a人在线观看| 亚洲AV无码乱码在线观看| 色九月亚洲综合网| 色五月五月丁香亚洲综合网| 亚洲av成人一区二区三区在线播放 | 国产精品V亚洲精品V日韩精品| 亚洲国产精品综合久久一线| 亚洲国产日韩成人综合天堂| 亚洲精品无码专区久久同性男| 亚洲午夜精品久久久久久浪潮| 国产a v无码专区亚洲av| 亚洲熟妇中文字幕五十中出| 亚洲精品无码不卡在线播HE | 久久亚洲国产精品一区二区| 亚洲av无码国产精品夜色午夜| 亚洲国产高清在线| 亚洲第一网站免费视频| 亚洲天堂免费在线| 亚洲精品国产第一综合99久久 | 337p日本欧洲亚洲大胆色噜噜| 亚洲成人网在线观看| 亚洲综合校园春色| 亚洲精品无码一区二区| 亚洲高清无码在线观看| 亚洲午夜国产精品无码| 亚洲va国产va天堂va久久| 久久久久久亚洲AV无码专区| 亚洲a级片在线观看| 亚洲欧洲国产综合AV无码久久| 欧洲亚洲综合一区二区三区| 亚洲日韩涩涩成人午夜私人影院| 亚洲综合精品网站在线观看| 亚洲AV综合色区无码一区爱AV| 亚洲网红精品大秀在线观看| 在线观看亚洲AV日韩A∨| 国产精品亚洲一区二区三区| 国产AV无码专区亚洲AWWW| 久久精品国产亚洲AV麻豆不卡|