需求:在本地已經完成了一個博客系統/數據可視化系統的開發,需要部署到系統上,展示個人主頁/個人作品
編程語言:Python
系統框架:Django
數據庫:MySQL
服務架構:uwsgi+nginx
IDE:pycharm
代碼管理:Git
我的系統目錄:
1、購買服務器
首先購買雲服務器,這裏選擇的阿里雲ECS,使用的ubuntu系統
個人建站一般選擇的是虛擬主機,這樣經濟實惠還方便,但是我使用的是Django自主開發,而且我的一些作品主要是數據項目,其中主要展現方式就是數據可視化,個人原因還是想把它用自己的技術在實現一遍。不過雲服務器價格不菲(不過大學生購買的話一年只要一百多,不要太優惠了)
2、構建系統環境
然後進入系統,新建用戶
在Unix/Linux中添加用戶賬號可以使用adduser或useradd命令,因爲adduser命令是指向useradd命令的一個鏈接,因此,這兩個命令的使用格式完全一樣。
useradd命令的使用格式如下: useradd [參數] 新建用戶賬號
參數 含義
-d 指定用戶登錄系統時的主目錄,如果不使用該參數,系統自動在/home目錄下建立與用戶名同名目錄爲主目錄
-m 自動建立目錄
-g 指定組名稱
相關說明:
● Linux每個用戶都要有一個主目錄,主目錄就是第一次登陸系統,用戶的默認當前目錄(/home/用戶);
● 每一個用戶必須有一個主目錄,所以用useradd創建用戶的時候,一定給用戶指定一個主目錄;
● 用戶的主目錄一般要放到根目錄的home目錄下,用戶的主目錄和用戶名是相同的;
● 如果創建用戶的時候,不指定組名,那麼系統會自動創建一個和用戶名一樣的組名。
命令含義
useradd -d /home/abc abc -m 創建abc用戶,如果/home/abc目錄不存在,就自動創建這個目錄,同時用戶屬於abc組
useradd -d /home/a a -g test -m 創建一個用戶名字叫a,主目錄在/home/a,如果主目錄不存在,就自動創建主目錄,
同時用戶屬於test組
cat /etc/passwd 查看系統當前用戶名
我使用的命令是:useradd wfxu -m -d /home/wfxu
這樣建立用戶的好處是會建立用戶目錄
然後再更改密碼:passwd wfxu
最後記得把用戶加入sudores中
- 進入到root用戶下。
- 添加文件的寫權限。也就是輸入命令”
chmod u+w /etc/sudoers
“。 - 編輯/etc/sudoers文件。也就是輸入命令”
gedit /etc/sudoers
“,進入編輯模式,找到這一 行:
“root ALL=(ALL) ALL
“在起下面添加”yourName ALL=(ALL)
ALL”(這裏的yourName是你的用戶名),然後保存退出。 - 撤銷文件的寫權限。也就是輸入命令”
chmod u-w /etc/sudoers
“。
新增用戶後每次切換用戶都會報錯 unable to resolve host 解決方法:
假設這臺機器名字叫abc(機器的hostname), 每次執行sudo 就出現這個警告訊息: sudo: unable to resolve host abc 雖然sudo 還是可以正常執行, 但是警告訊息每次都出來,而這只是機器在反解上的問題,
所以就直接從/etc/hosts
設定, 讓abc(hostname) 可以解回127.0.0.1 的IP 即可.
/etc/hosts 原始內容
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
在127.0.0.1 localhost 後面加上主機名稱(hostname) 即可, /etc/hosts 內容修改成如下:
127.0.0.1 localhost abc #要保證這個名字與 /etc/hostname中的主機名一致纔有效 或改成下面這兩行
127.0.0.1 localhost
127.0.0.1 abc 這樣設完後, 使用sudo 就不會再有那個提示信息了。
3、安裝git
命令:sudo apt-get install git
會報錯:Unable to locate package
這是因爲新裝的ubuntu系統,沒有update的原因。然後進行update,輸入命令:sudo apt-get update
,最後再安裝。
4、虛擬環境準備
● 在本地的虛擬環境中,項目根目錄下,執行命令收集所有包pip freeze > plist.txt
● 通過git軟件將開發好的項目上傳到此服務器的某個目錄
git config –global user.name “XX”
git config –global user.email XX
git clone [email protected]:賬號名/項目名.git
git pull
上面是從git上獲取項目,以下是提交代碼
git add [目錄]
git commit -m “說明”
git push origin master
● 在服務器上安裝並創建虛擬環境,如果已有則跳過此步
sudo apt-get install python-virtualenv
sudo easy_install virtualenvwrapper
mkvirtualenv [虛擬環境名稱]
在安裝成功後創建環境的時候可能會報沒有命令的錯誤,那麼
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
把上面的命令加到 ~/.bashrc 後,source ~/.bashrc
在運行mkvirtualenv 就可以了
● 安裝數據庫
在上面的plist.txt中會有MySQL-python這個安裝包,
mysql-python安裝時EnvironmentError: mysql_config not found
主要原因是沒有安裝:libmysqlclient-dev
sudo apt-get install libmysqlclient-dev
找到mysql_config文件的路徑
sudo updatedb
locate mysql_config
mysql_config的位置爲:/usr/bin/mysql_config
在mysql-python源碼包下找到:setup_posix.py 文件,然後找到文件中的 mysql_config.path 將其值改爲:/usr/bin/mysql_config,然後 sudo python setup.py install ,就ok了
這是網上說的,但我不沒有照做,我是再安裝msyql-server,然後就OK了
● 在虛擬環境上工作,安裝所有需要的包
workon [虛擬環境名稱]
pip install -r plist.txt
5.服務測試
● 更改settings.py文件
DEBUG = False
ALLOW_HOSTS=['*',]表示可以訪問服務器的ip
啓動服務器,運行正常,但是靜態文件無法加載。
這裏如果還要注意的是settings中MySQL的連接要更改,否則會Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
報錯。
然後再運行 python manage.py runserver
測試是否可以運行
阿里雲服務器有兩個網絡ip,一個是公網ip,這個就是對外的訪問IP地址,也就是你域名解析的地址,還有一個是私有ip,主要是內部通信的,所以如果想在瀏覽器裏測試效果,需要在上面你的命令加上IP地址和端口(雲服務器的端口也需要添加,在安全組配置中設置添加規則)
我是直接添加公網IP的,然後就
Error: That IP address can't be assigned-to.
解決方法是:python manage.py runserver 0.0.0.0:8000.
6、安裝使用uwsgi
● 安裝uWSGI
pip install uwsgi
● 配置uWSGI,在項目中新建文件uwsgi.ini,編寫如下配置
[uwsgi]
socket=外網ip:端口(使用nginx連接時,使用socket)
http=外網ip:端口(直接做web服務器,使用http)
chdir=項目根目錄
wsgi-file=項目中wsgi.py文件的目錄,相對於項目根目錄
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log
● 啓動:uwsgi --ini uwsgi.ini
● 停止:uwsgi --stop uwsgi.pid
● 重啓:uwsgi --reload uwsgi.pid
(官網上這個命令重啓,但我試了根本沒用)
● 使用http協議查看網站運行情況,運行正常,但是靜態文件無法加載
因爲現在還沒有使用nginx,所以使用的http協議,這裏同樣的不能使用公網IP
7、安裝使用nginx
● 通過命令安裝
sudo apt-get install nginx
● 網上說默認安裝到/usr/local/nginx目錄,但是我這裏不是,配置目錄和啓動命令也不相同,配置文件夾在/etc/nginx/nginx.conf,具體命令如下
● 查看版本:sudo usr/sbin/nginx或nginx -v
● 啓動:sudo usr/sbin/nginx或nginx
● 停止:sudo usr/sbin/nginx或nginx -s stop
● 重啓:sudo usr/sbin/nginx或nginx -s reload
● 通過瀏覽器查看nginx運行結果
● 指向uwsgi項目:編輯conf/nginx.conf文件
sudo vi /etc/nginx/nginx.conf
在server下添加新的location項,指向uwsgi的ip與端口
location / {
include uwsgi_params;將所有的參數轉到uwsgi下
uwsgi_pass uwsgi的ip與端口;
}
具體如下
server {
listen 80 default_server;
#listen [::]:80 default_server;
#root /var/www/execution;
#index index.html index.htm index.nginx-debian.html;
server_name execution; # IP or FQDN
location /static {
alias /var/www/execution/static;
}
location / {
uwsgi_pass 172.26.165.228:8080;
include uwsgi_params;
#try_files $uri $uri/ =404;
}
}
● 修改uwsgi.ini文件,啓動socket,禁用http
● 重啓nginx、uwsgi(啓動nginx會報nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/default:17
的錯,把這個文件刪除就行了:sudo rm /etc/nginx/sites-enabled/default
)
● 在瀏覽器中查看項目,發現靜態文件加載不正常,接下來解決靜態文件的問題
8、解決靜態文件
● 所有的靜態文件都會由nginx處理,不會將請求轉到uwsgi
● 配置nginx的靜態項,打開conf/nginx.conf文件,找到server,添加新location
location /static {
alias /var/www/execution/static;
}
● 在服務器上創建目錄結構“/var/www/execution/”
● 修改目錄權限sudo chmod 777 /var/www/execution
● 創建static目錄,注意順序是先分配權限,再創建目錄mkdir static
,目的是可以將靜態文件複製到static文件夾中
● 修改settings.py文件
STATIC_ROOT='/var/www/execution/static/'
STATIC_URL='/static/'
● 收集所有靜態文件到static_root指定目錄:python manage.py collectstatic
● 最終目錄結構如下圖:
● 重啓nginx、uwsgi
部署成功!
ps:今天又重新買了一臺一年的服務器,重新部署了下,地址爲:http://106.15.177.175/showtime/execution 效果一樣