通過 Windows 命令提示符(cmd)在桌面新建文件夾,并在該文件夾中編譯、運行一段 Java 程序段
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服務器,那肯定是配置文件寫錯了,得去看一下。
九、啟動項目
既然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小時內刪除侵權內容。