python-django 阿里云 ECS 服务器部署 uwsgi+nginx 过程解说、反正我也在弄着 顺手转载记录一下

如题 觉得还不错转载一下加点自己的理解标注一下
 

  1. 编程语言:Python

  2. 系统框架:Django

  3. 数据库:MySQL

  4. 服务架构:uwsgi+nginx

  5. IDE:pycharm

  6. 代码管理:Git

  •  

我的系统目录: 
这里写图片描述

1、购买服务器

首先购买云服务器,这里选择的阿里云 ECS,使用的 ubuntu 系统 
这里写图片描述
个人建站一般选择的是虚拟主机,这样经济实惠还方便,但是我使用的是 Django 自主开发,而且我的一些作品主要是数据项目,其中主要展现方式就是数据可视化,个人原因还是想把它用自己的技术在实现一遍。不过云服务器价格不菲(不过大学生购买的话一年只要一百多,不要太优惠了) 
这里写图片描述

2、构建系统环境

然后进入系统,新建用户 
在 Unix/Linux 中添加用户账号可以使用 adduser 或 useradd 命令,因为 adduser 命令是指向 useradd 命令的一个链接,因此,这两个命令的使用格式完全一样。 
useradd 命令的使用格式如下: useradd [参数] 新建用户账号

 
  1. 参数 含义

  2. -d 指定用户登录系统时的主目录,如果不使用该参数,系统自动在/home目录下建立与用户名同名目录为主目录

  3. -m 自动建立目录

  4. -g 指定组名称

  •  

相关说明: 
● Linux 每个用户都要有一个主目录,主目录就是第一次登陆系统,用户的默认当前目录 (/home/ 用户); 
● 每一个用户必须有一个主目录,所以用 useradd 创建用户的时候,一定给用户指定一个主目录; 
● 用户的主目录一般要放到根目录的 home 目录下,用户的主目录和用户名是相同的; 
● 如果创建用户的时候,不指定组名,那么系统会自动创建一个和用户名一样的组名。 
命令含义

 
  1. useradd -d /home/abc abc -m 创建abc用户,如果/home/abc目录不存在,就自动创建这个目录,同时用户属于abc组

  2. useradd -d /home/a a -g test -m 创建一个用户名字叫a,主目录在/home/a,如果主目录不存在,就自动创建主目录,

  3. 同时用户属于test组

  4. cat /etc/passwd 查看系统当前用户名

  •  

我使用的命令是:useradd wfxu -m -d /home/wfxu 
这样建立用户的好处是会建立用户目录 
然后再更改密码:passwd wfxu 
最后记得把用户加入 sudores 中

  1. 进入到 root 用户下。
  2. 添加文件的写权限。也就是输入命令”chmod u+w /etc/sudoers“。
  3. 编辑 /etc/sudoers 文件。也就是输入命令”gedit /etc/sudoers“, 进入编辑模式,找到这一 行: 
    root ALL=(ALL) ALL“在起下面添加”yourName ALL=(ALL) 
    ALL”(这里的 yourName 是你的用户名),然后保存退出。
  4. 撤销文件的写权限。也就是输入命令”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

● 在服务器上安装并创建虚拟环境,如果已有则跳过此步

 
  1. sudo apt-get install python-virtualenv

  2. sudo easy_install virtualenvwrapper

  3. mkvirtualenv [虚拟环境名称]

  •  

在安装成功后创建环境的时候可能会报没有命令的错误,那么

 
  1. export WORKON_HOME=$HOME/.virtualenvs

  2. 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 文件的路径

 
  1. sudo updatedb

  2. locate mysql_config

  3. mysql_config的位置为:/usr/bin/mysql_config

  4. 在mysql-python源码包下找到:setup_posix.py 文件,然后找到文件中的 mysql_config.path 将其值改为:/usr/bin/mysql_config,然后 sudo python setup.py install ,就ok了

  5. 这是网上说的,但我不没有照做,我是再安装msyql-server,然后就OK了

  •  

● 在虚拟环境上工作,安装所有需要的包

 
  1. workon [虚拟环境名称]

  2. pip install -r plist.txt

  •  
  • 5. 服务测试

● 更改 settings.py 文件

 
  1. DEBUG = False

  2. 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.
  • 1
  • 1

解决方法是:python manage.py runserver 0.0.0.0:8000.

6、安装使用 uwsgi

● 安装 uWSGI

pip install uwsgi
  • 1
  • 1

● 配置 uWSGI,在项目中新建文件 uwsgi.ini,编写如下配置

 
  1. [uwsgi]

  2. socket=外网ip:端口(使用nginx连接时,使用socket)

  3. http=外网ip:端口(直接做web服务器,使用http)

  4. chdir=项目根目录

  5. wsgi-file=项目中wsgi.py文件的目录,相对于项目根目录

  6. processes=4

  7. threads=2

  8. master=True

  9. pidfile=uwsgi.pid

  10. 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
  • 1
  • 1

● 网上说默认安装到 /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
  • 1
  • 1

在 server 下添加新的 location 项,指向 uwsgi 的 ip 与端口

 
  1. location / {

  2. include uwsgi_params;将所有的参数转到uwsgi下

  3. uwsgi_pass uwsgi的ip与端口;

  4. }

  •  

具体如下

 
  1. server {

  2. listen 80 default_server;

  3. #listen [::]:80 default_server;

  4. #root /var/www/execution;

  5. #index index.html index.htm index.nginx-debian.html;

  6. server_name execution; # IP or FQDN

  7.  
  8. location /static {

  9. alias /var/www/execution/static;

  10. }

  11.  
  12. location / {

  13. uwsgi_pass 172.26.165.228:8080;

  14. include uwsgi_params;

  15. #try_files $uri $uri/ =404;

  16. }

  17. }

  • ● 修改 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

 
  1. location /static {

  2. alias /var/www/execution/static;

  3. }

  •  

● 在服务器上创建目录结构 “/var/www/execution/” 
● 修改目录权限 sudo chmod 777 /var/www/execution 
● 创建 static 目录,注意顺序是先分配权限,再创建目录 mkdir static,目的是可以将静态文件复制到 static 文件夹中 
● 修改 settings.py 文件

 
  1. STATIC_ROOT='/var/www/execution/static/'

  2. STATIC_URL='/static/'

  •  

● 收集所有静态文件到 static_root 指定目录:python manage.py collectstatic 
● 最终目录结构如下图: 
这里写图片描述 
● 重启 nginx、uwsgi 
部署成功! 
这里写图片描述
ps:mac 系统下的阿里云用py部署、菜鸡上路 自学咯、多看看文章、研究一下的啦

猜你喜欢

转载自blog.csdn.net/u011516972/article/details/88909894
今日推荐