Nginx+Uwsgi+Flask在阿里云服务器上的部署

先说明一下,我用的系统是centos6.8,一开始想用debian的系统,但是奈何国内关于debian中配置nginx和uwsgi的文档太少,本人不才,所以还是选择了centos。。。。。。个人感觉centos的系统配置还是挺简单的。。。不过存在很多防火墙的问题,下边一步步来说。。。。

centos上应该是默认已经安装了Python2.6,不过你要想安装其他的版本就需要自己首先安装一个pyenv的东西。。。。

1、安装pyenv

  先说一下pyenv吧,这是一个多版本共存的版本管理器。windows上就不用说了,可以安装多个版本的Python,但是Linux上就会有问题了,所以需要这么一个管理器。

     第一步,安装:

# curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

  下边是安装过程。。。

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2099  100  2099    0     0   4787      0 --:--:-- --:--:-- --:--:--  4792

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bash_profile:

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

  到了这,你就完成了安装了,接下来就是配置:

# cat>>.bashrc<<EOF

  把下边这几句添加进去

### pyenv settings
export PYENV_ROOT="\$HOME/.pyenv"
export PATH="\$PYENV_ROOT/bin:\$PATH"
eval "\$(pyenv init -)"
eval "\$(pyenv virtualenv-init -)"
EOF

  接下来你就可以安装你所需要的Python版本了,首先查看一下有什么版本

# pyenv install --list

  我目前做的是一个关于科学计算的项目,所以我安装了一个Anaconda2-4.3.1-Linux-x86_64.sh,各位可以根据自己的需要安装。。。。

  顺便说一下,这个版本会从官网下载,文件又特别大,建议大家先获取下载地址,然后自己先下载下来,然后传到Linux上,我使用xshell连接的远程,安装一个rz就可以上传文件啦。。。

apt-get install lrzsz

  当然大家可以使用别的方式下载。。。我这就都默认大家已经装好了,,,,然后还有一个很重要的问题,就是需要把你下载的版本移动到~/.pyenv/cache文件夹下,默认好像是没有什么cache文件夹的,自己可以创建一个(mkdir cache)

 mv Anaconda2-4.3.1-Linux-x86_64.sh ~/.pyenv/cache

  然后就可以安装了,,,

# pyenv install anaconda2-4.3.1 -v

  然后需要更新一下数据库

# pyenv rehash

  这时候你可以查看一下自己机器上的安装的Python版本(带*号的是系统安装的版本,并不是你自己安装的。。。)

# pyenv versions
* system (set by /root/.pyenv/version)
  anaconda2-4.3.1

  下面就到了最重要的一步了,你安装的版本怎么设置成默认的呢?

# pyenv global anaconda2-4.3.1

  来让我们看一下是否自己安装的版本变成了默认的呢?

     

  Yeah!!!终于完成了,哈哈哈。。。。

2、安装nginx

  首先安装一些依赖包,,,

# sudo yum -y install gcc gcc-c++ make autoconf automake
# sudo yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel

  接下来就是安装nginx了

# wget http://nginx.org/download/nginx-1.2.7.tar.gz
# tar -zxv -f nginx-1.2.7.tar.gz
# cd nginx-1.2.7
# ./configure
# make
# sudo make install

  接下来启动nginx服务器,

# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

  你可以使用浏览器访问http://127.0.0.1/,如果看到Welcome to nginx!的字样,就表示安装成功了。

3、安装uwsgi

  先安装相关依赖python-devel、setuptools,libxml2-devel,直接用yum安装。如果是自行编译安装的python,可以不用安装python-devel。

# yum -y install python-devel python-setuptools libxml2-devel

  下边安装uwsgi,,,,

# pip install uwsgi

  uwsgi安装完了,然后就是上传自己的项目,记住一定要自己创建一个目录,我是创建了/home/lh,然后把项目传到这个路径的下面了

  上传解压的过程我就不说了·····

4、nginx和uwsgi通信

    就是在你的项目下边创建一个xml文件,也可以是ini文件,是一样的,,,然后在文件里面写下面的内容

<uwsgi>
# 项目的路径
<pythonpath>/home/lh</pythonpath>
# 启动文件的文件名(例如:app.py,直接写app)
<module>app</module>
# 启动文件中的实例(执行文件的实例)
<callable>app</callable>
# 和nginx通信的IP和端口,必须和nginx配置里的uwsgi_pass一致。
<socket>127.0.0.1:8000</socket>
<master/>
# 开启几个进程
<processes>4</processes>
<memory-report/>
</uwsgi>

  然后配置nginx,配置nginx.conf,把location中的内容加上下面两行(/usr/local/nginx/conf/nginx.conf)

include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;

  修改完成后,看一下是否配置的正确

/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

  现在就配置完成了,重新启动一下nginx,找到nginx的进程号

# ps -ef|grep nginx

  然后杀掉进程,注意这里应该是有两个进程,然后重新启动nginx

# kill -9 进程号
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

  启动完了nginx,还有最重要的一个要启动uwsgi,可以直接进入到项目中,启动

# uwsgi 你写的xml或ini文件

  这时,就完成了啊,使用外网访问一下你的阿里云分配给你的外网地址,能访问说明你配置完成了,哈哈,,,

ps:也是最重要的一点,这一点让我郁闷了好几天。。。一定要开启防火墙,阿里云的服务器默认是不开的,所以自己要打开端口

# vim /etc/sysconfig/iptables

  如果没有这个文件,自己也可以自己创建一个,把下面的内容贴到文件里,从这里面你可以开放自己需要的端口

     # Firewall configuration written by system-config-securitylevel
     # Manual customization of this file is not recommended.*filter
     :INPUT ACCEPT [0:0]
     :FORWARD ACCEPT [0:0]
     :OUTPUT ACCEPT [0:0]
     :RH-Firewall-1-INPUT - [0:0]
     -A INPUT -j RH-Firewall-1-INPUT
     -A FORWARD -j RH-Firewall-1-INPUT
     -A RH-Firewall-1-INPUT -i lo -j ACCEPT
     -A RH-Firewall-1-INPUT -p icmp –icmp-type any -j ACCEPT
     -A RH-Firewall-1-INPUT -p 50 -j ACCEPT
     -A RH-Firewall-1-INPUT -p 51 -j ACCEPT
     -A RH-Firewall-1-INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
     -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 53 -j ACCEPT
     -A RH-Firewall-1-INPUT -m state –state NEW -m udp -p udp –dport 53 -j ACCEPT
     -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT    
     -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT
     -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
     -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 443 -j ACCEPT
     -A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited
      COMMIT

  最后重启iptables。。。。。

# service iptables restart

 如果再不行,你们就私聊我吧,搞了一周,终于搞完,中间遇到了各种各样的问题,总结一下:

  1、外网不能访问:一般是你的端口没开(也不都是这个原因,其他的原因我也不知道,,,)

  2、uwsgi和nginx不能交互:(一般是通信的IP和端口不对,当然不排除有二般的原因,,,)

  3、uwsgi不能启动:应该是你没有到项目的下面去启动,导致找不到xml或ini文件。。。

  4、待续吧。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

  

 

posted on 2017-05-21 18:09  python屌丝的逆袭  阅读(1060)  评论(1编辑  收藏  举报

导航