centos7 配置 uwsgi 系统服务(systemd)

背景生产环境中采用nginx + uwsgi + django 来部署web服务,这里需要实现uwsgi的启动和停止,简单的处理方式可以直接在命令行中启动和kill掉uwsgi服务,但为了更安全、方便的管理uwsgi服务,配置uwsgi到systemd服务中,同时实现开启自启的功能;
另,鉴于supervisor不支持python3,没采用supervisor来管理uwsgi服务;

具体配置方法如下:

step1. 创建配置文件

/etc/systemd/system/server_uwsgi.service

step2. 填入以下内容

[Unit]
Description=HTTP Interface Server
After=syslog.target

[Service]
KillSignal=SIGQUIT
ExecStart=/usr/bin/uwsgi --ini /path/uwsgi.ini
Restart=always
Type=notify
NotifyAccess=all
StandardError=syslog

[Install]
WantedBy=multi-user.target

step3. 将该服务加入到systemd中

systemctl enable /etc/systemd/system/server_uwsgi.service

然后就可以通过systemctl来控制服务的启停

systemctl stop server_uwsgi.service 关闭uwsgi服务
systemctl start server_uwsgi.service 开启uwsgi服务
systemctl restart server_uwsgi.service 重启uwsgi服务

注意事项:

如果uwsgi配置文件中配置了 daemonize=/path/uwsgi.log (uwsgi服务以守护进程运行)
会导致sytemctl启动时多次重启而导致启动失败
需改为 logto=/path/uwsgi.log

ubuntu+django+uwsgi+nginx前后端分离部署完整版

1.部署之前确定你已经将你的项目上传到你的服务器当中。在我之前的文章已经提到,本文默认项目已经运行成功,并且django项目中允许所有地址进行访问。下面也有我之前的部署,其实按照下面做到虚拟环境能够运行django就可以继续向下读了。

2. 将uwsgi安装到你的virtualenv中,初步设定项目名字为induapp,项目存放在/home/ubuntu/induapp

pip install uwsgi

基础测试(这也是uwsgi文档直接就有的)

创建一个test.py文件

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3

运行uwsgi:

uwsgi --http :8000 --wsgi-file test.py

如果云主机能够直接外网访问的话

在浏览器访问 http://公网IP:8000即可,会提供一个“hello world”消息

如果云主机禁止外网访问

curl 127.0.0.1:8000

也能看到效果

这样意味下面的组建已经正常,不需要重复验证

web client <-> uWSGI <-> python

3.uwsgi测试运行django项目

uwsgi --http :8000 --module induapp.wsgi

module induapp.wsgi:加载指定的wsgi模块

跟上面相同的做法来验证是否能够访问到django项目,这样意味下面的组建已经正常,不需要重复验证

web client<->uWSGI<->Django

4.基本的nginx

安装nginx

sudo apt-get install nginx
sudo /etc/init.d/nginx start

同上我们能够在浏览器访问80端口或者curl访问80端口

如果会报错的话,这里建议两个比较快的命令

vim /var/log/nginx/error.log

或者

sudo nginx -t

如果正常运行,意味着

web client<->the web server

其实默认的80端口很容易会被占用,并且你想要在哪里使用nginx,那么你将必须重新配置nginx来提供另一个端口的服务,所以我们选择8080来当作后台的端口,8001来当作前台的端口。

4.为站点配置nginx

首先我们需要uwsgi_params文件,可用在uwsgi发行版本的nginx目录下,或者下面的连接就有,直接复制到induapp项目根目录中,不需要进行修改。

现在就可以在项目induapp根目录下面创建induapp_nginx.conf的文件,然后编写下面文件。

# mysite_nginx.conf

# the upstream component nginx needs to connect to
upstream django {
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8080;
    # the domain name it will serve for
    server_name 127.0.0.1; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /home/ubuntu/induapp/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /home/ubuntu/induapp/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /home/ubuntu/induapp/uwsgi_params; # the uwsgi_params file you installed
    }
}

将这个文件链接到/etc/nginx/sites-enabled,这样nginx就可以看到它了:
sudo ln -s ~/induapp/induapp_nginx.conf /etc/nginx/sites-enabled/

5.基本nginx测试

sudo /etc/init.d/nginx restart

让nginx来测试test.py

我们可以查看端口号占用情况并杀掉进程

netstat -apn|grep 8000
kill -9 <pid>
uwsgi --socket :8000 --wsgi-file test.py

显然可以看出,已经配置了nginx在8000端口与uWSGI通信,而对外使用8080端口,访问8080端口来进行检查。

6.使用Unix socket而不是端口

使用Unix socket会比端口更好,开销更少。

编写induapp_nginx.conf,修改它来匹配:

upstream django {
    server unix:///home/ubuntu/induapp/induapp.sock; # for a file socket
    # server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}

然后重启nginx

sudo /etc/init.d/nginx restart

再次运行uwsgi

uwsgi --socket mysite.sock --wsgi-file test.py

这次,socket会告诉uwsgi使用哪个文件

在浏览器或者curl尝试访问8080端口

如果那不行

检查nginx错误日志(/var/log/nginx/error.log)。如果你看到像这样的信息:

connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission denied)

那么可能你需要管理这个socket上的权限,从而允许nginx使用它。

尝试:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)

或者:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more sensible)

你可能还必须添加你的用户到nginx的组 (可能是 www-data),反之亦然,这样,nginx可以正确地读取或写入你的socket。

值得保留nginx日志的输出在终端窗口中滚动,这样,在解决问题的时候,你就可以容易的参考它们了。

6.使用uwsgi和nginx运行django应用

运行我们的Django应用

uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664

现在,uWSGI和nginx应该不仅仅可以为一个”Hello World”模块服务,还可以为你的Django项目服务。

在induapp项目中配置induapp_uwsgi.ini文件

[uwsgi]
project = induapp
base = /home/ubuntu
socket = 127.0.0.1:8000

chdir = %(base)/%(project)
home = %(base)/anaconda3/envs/djangoEnv
module = %(project).wsgi

master = true
processes = 10

socket = %(base)/%(project)/%(project).sock
chmod-socket = 666
vacuum = true

pythonpath = /home/ubuntu/anaconda3/envs/djangoEnv/lib/python3.6/site-packages

值得注意的是要是没有最后一行的pythonpath很可能在初始化uwsgi应用的时候出现 no moudle named xxx的错误。

chdir是项目路径,home是虚拟环境路径。

使用这个文件运行

uwsgi --ini induapp_uwsgi.ini # the --ini option is used to specify a file

打印出来的结果能够预测Django站点是否预期工作

7.系统安装uwsgi

停用虚拟环境

source deactivate

然后在系统中安装uWSGI:

sudo pip install uwsgi

再次检查是否能运行

uwsgi --ini induapp_uwsgi.ini

Emperor模式

# 系统启动时运行uWSGI
# 最后一步是让这一切在系统启动的时候自动发生。
# 对于许多系统来说,最简单 (如果不是最好的)的方式是使用 rc.local 文件。
# 编辑 /etc/rc.local 然后在”exit 0”行前添加:
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid ubuntu --gid ubuntu --daemonize /var/log/uwsgi-emperor.log

选项表示:

  • emperor: 查找vassals (配置文件)的地方
  • uid: 进程一旦启动后的用户id
  • gid: 进程一旦启动后的组id

文档中的用户是www-data,

/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data --daemonize /var/log/uwsgi-emperor.log

但常常因为权限不够高,访问时候会出现502的错误,所以我们这里直接使用Ubuntu来提高我们的权限。

7.完成前台的部署

将前台的静态文件打包到一个文件夹上传到服务器中,我们这里是/home/ubuntu/knowGraph

我们在项目根目录创建induapp_web_nginx.conf文件并进行编写。

server {
        listen       8001;
        server_name  127.0.0.1;

        location / {
            root /home/ubuntu/knowledgeGraph;
            index index.html;
        }
        location /neo4j {
            proxy_pass http://127.0.0.1:8080;
            proxy_send_timeout 1800;
            proxy_read_timeout 1800;
            proxy_connect_timeout 1800;
            client_max_body_size 2048m;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header  Host              $http_host;   # required for docker client's sake
            proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
            proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header  X-Forwarded-Proto $scheme;
        }
        location /admin {
            proxy_pass http://127.0.0.1:8080;
            proxy_send_timeout 1800;
            proxy_read_timeout 1800;
            proxy_connect_timeout 1800;
            client_max_body_size 2048m;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header  Host              $http_host;
            proxy_set_header  X-Real-IP         $remote_addr;
            proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header  X-Forwarded-Proto $scheme;

        }
}

下面就是对这个文件的解析

该文件监听的是8001端口,location / 对应的是前端静态文件的初始化界面。/neo4j和/admin对应的是django的url。基本上格式可以不做修改,我们值得注意的是proxy_pass http://127.0.0.1:8080(也就是刚刚我们后台运行在nginx的端口。)注意的是http://127.0.0.1:8080后面不应该带/号,不然访问127.0.0.1:8001/neo4就会变成访问127.0.0.1:8080,跟我们想要的结果不同。

将这个文件链接到/etc/nginx/sites-enabled,这样nginx就可以看到它了: sudo ln -s ~/induapp/induapp_web_nginx.conf /etc/nginx/sites-enabled/

最后的最后,重启服务

sudo /etc/init.d/nginx restart
uwsgi --ini induapp_uwsgi.ini -d /home/induapp/induapp.log

nginx+uwsgi启动Django项目

1.安装项目环境

  • 系统环境:ubuntu16.04
  • python环境:python3.5.2
  • Django版本:django1.11.7
  • nginx环境:nginx_1.10.3
  • 虚拟环境:virtualenv15.1.0
  • uwsgi版本:uwsgi2.0.17.1

安装并进入项目虚拟环境:

sudo apt-get install virtualenv
virtualenv -p python3 env_my_project 
source env_my_project/bin/activate
pip install -r requirements.txt 

2.项目配置及运行测试

修改项目配置文件:
cp my_project/settings_local.py.example my_project/settings_local.py

修改es配置文件:
cp rs_es/es_settings.py.example rs_es/es_settings.py

wsgi.py:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings_local")
application = get_wsgi_application()

项目运行测试:
python manage.py collectstatic  # 收集静态文件
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8001

未分类

3.NGINX和UWSGI相关配置

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/my_project
sudo ln -s /etc/nginx/sites-available/my_project /etc/nginx/sites-enabled/
sudo vim /etc/nginx/sites-enabled/my_project

nginx配置:
upstream my_project{
    server unix:///var/run/my_project.sock;
}

server {
    listen      8001;  //服务的端口号   服务通过nginx与uwsgi通信来启动

    server_name 192.168.xx.xx;  //nginx代理的ip  
    charset     utf-8;

    # max upload size
    client_max_body_size 10M;

    # send all non-media requests to the Django server.
    location / {
        uwsgi_pass  my_project;
        include     /etc/nginx/uwsgi_params;
    }

    location /static/ {
        root /home/ubuntu/my_project;
    }
}

Uwsgi配置:
sudo mkdir /var/log/uwsgi
sudo chmod -R 777 /var/log/uwsgi

uwsgi.ini:
[uwsgi]
chdir=/home/ubuntu/my_project
home=/home/ubuntu/my_project/env_my_project
module=my_project.wsgi:application

socket=/var/run/my_project.sock
chmod-socket = 666

master=True
processes = 5
max-requests=5000

# clear environment on exit
vacuum=True

pidfile=/var/run/my_project.pid
daemonize=/var/log/uwsgi/my_project.log

# git pull 自动重启服务
touch-reload=.git/index

4.配置Emperor mode监听和系统自动启动uwsgi

配置Emperor mode监听
sudo mkdir /etc/uwsgi
sudo mkdir /etc/uwsgi/vassals
sudo ln -s /home/ubuntu/my_project/uwsgi.ini /etc/uwsgi/vassals/

系统自动启动uwsgi
sudo vim /etc/rc.local
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals

5.通过uwsgi启动django服务

启动uwsgi
uwsgi --ini uwsgi.ini

重启nginx
sudo service nginx restart

启动django服务
sudo uwsgi --reload /var/run/my_project.pid

此时在浏览器通过ngnix代理出来的ip和端口即可访问服务

Django+uwsgi+nginx+angular.js项目

这次部署的前后端分离的项目:

前端采用angular.js,后端采用Django(restframework),他俩之间主要以json数据作为交互

Django+uwsgi的配置可以参考我之前的博客:http://www.cnblogs.com/52-qq/p/8873328.html

这篇博客里面都是静态页面,而不是采用restapi的形式,不过都是类似的,配置完之后采用uwsgi启动Django项目

前端:吧前端所有的代码拷贝在Django项目根路径下(也可以不用,当然我这么说是为了方便),

然后直接在nginx中配置,就可以了(不过前端框架也需要启动)

未分类

这段代码的配置才是比较重要的,类似的vue项目的部署也都类似

Flask学习11:阿里云新手Flask + nginx + uwsgi + ubuntu的完整项目部署教程

Flask项目部署

web工作原理

客户端 < = > 服务器(nginx) < = > uWSGI < = > Python(Flask) < = > 数据库

nginx安装

源码安装、apt-get install …

sudo /usr/local/nginx/sbin/nginx -s reload

添加虚拟主机

1.在nginx的主配置文件最后一个大括号的上面添加:

include vhost/*.conf;

2.在conf/下新建文件夹,用于保存所有的虚拟主机配置文件

mkdir vhost

3.vhost目录下新建一个虚拟主机的配置文件(sudo vim idandan.vip.conf)

server{
    listen 80;
  server_name idandan.vip;
  location / {
      root html/blog;
      index index.html;
  }
}

# sudo vim idandan.vip.conf

4.在html目录下创建blog文件夹,在blog下新建index.html

Hello World

5.重启nginx(sudo /usr/local/nginx/sbin/nginx -s reload)

6.添加本地的域名解析,修改文件:(C:WindowsSystem32driversetchosts)

最后一行添加:139.196.81.238 idandan.vip

7.测试,在浏览器地址栏输入:idandan.vip

uWSGI

1.安装:pip3 install uwsgi

2.配置:

http:    # 采用http协议
socket:      # 采用socket协议
wsgi-file    # 将数据交给哪个模块
callable # 具体可调用的对象
chdir        # 指定uwsgi启动后的当前目录
daemonize    # 后台运行,需要指定一个日志文件


# blog.py文件

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
 return 'Hi'

if __name__ == '__main__':
 app.run()

3.简单实例

1.在blog目录下创建blog.py文件,里面写上flask启动代码用于测试
2.启动:
    sudo uwsgi --http host:port --wsgi-file blog.py --callable app

4.socket方式启动

1)nginx转发请求:

python 
server{ 
listen 80; 
server_name idandan.vip; 
location / { 
# root html/blog; 
# index index.html; 
include uwsgi_params; 
uwsgi_pass 127.0.0.1:5000; 
} 
} 

2)以socket方式启动

sudo uwsgi --socket 127.0.0.1:5000 --wsgi-file blog.py --callable app

3)将启动参数配置写进配置文件

[uwsgi]
socket  = 127.0.0.1:5000
wsgi-file = blog.py
callable = app

(blog/vim uwsgi.ini)
启动:sudo uwsgi wsgi.ini

静态文件处理

1.准备静态资源

python
1.在项目根目录下(blog)创建static目录
2.将图片拷贝到static下

2.配置nginx转发

# 添加一个location

location /static{
 # root html/blog;

# 或

alias html/blog/static;  # 两种方式都可以
}

uwsgi的定时脚本任务

定时任务:

定时任务的脚本cron_job.py

未分类

意思就是每天9.20执行test module的init_daily_activities 方法

项目中的定时任务不管多少就加在这里,然后重启项目(django应用)

重启脚本就叫server.py吧

未分类

python Web开发之 WSGI & uwsgi & uWSGI

未分类

未分类

首先弄清下面几个概念:

WSGI

全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。server和application的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Bottle, Flask, Django。

WSGI是Web 服务器(uWSGI)与 Web 应用程序或应用框架(Django)之间的一种低级别的接口

wsgi server (比如uWSGI) 要和 wsgi application(比如django )交互,uwsgi需要将过来的请求转给django 处理,那么uWSGI 和 django的交互和调用就需要一个统一的规范,这个规范就是WSGI WSGI(Web Server Gateway Interface)

WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。自从 WSGI 被开发出来以后,许多其它语言中也出现了类似接口。

WSGI 的官方定义是,the Python Web Server Gateway Interface。从名字就可以看出来,这东西是一个Gateway,也就是网关。网关的作用就是在协议之间进行转换。

WSGI 是作为 Web 服务器与 Web 应用程序或应用框架之间的一种低级别的接口,以提升可移植 Web 应用开发的共同点。WSGI 是基于现存的 CGI 标准而设计的。

uwsgi

与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。

uWSGI

是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

WSGI协议主要包括server和application两部分

  • WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;

  • WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。application中可以包括多个栈式的中间件(middlewares),这些中间件需要同时实现server与application,因此可以在WSGI服务器与WSGI应用之间起调节作用:对服务器来说,中间件扮演应用程序,对应用程序来说,中间件扮演服务器。

WSGI协议其实是定义了一种server与application解耦的规范,即可以有多个实现WSGI server的服务器,也可以有多个实现WSGI application的框架,那么就可以选择任意的server和application组合实现自己的web应用。例如uWSGI和Gunicorn都是实现了WSGI server协议的服务器,Django,Flask是实现了WSGI application协议的web框架,可以根据项目实际情况搭配使用。

未分类

像Django,Flask框架都有自己实现的简单的WSGI server,一般用于服务器调试,生产环境下建议用其他WSGI server。

FastCgi协议, uwsgi协议, http协议有什么用?

nginx 和 uWSGI交互就必须使用同一个协议,而上面说了uwsgi支持fastcgi,uwsgi,http协议,这些都是nginx支持的协议,只要大家沟通好使用哪个协议,就可以正常运行了。

uwsgi是服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用程序和返回

# WSGI和uwsgi
https://www.jianshu.com/p/679dee0a4193
# uWSGI,WSGI和uwsgi
https://www.cnblogs.com/wspblog/p/8575101.html

Django+Linux+Uwsgi+Nginx项目部署文档

WSGI

在生产环境中使用WSGI作为python web的服务器

WSGI:全拼为Python Web服务器网关接口,Python Web服务器网关接口,是项目默认会生成一个wsgi.py文件,确定了设置模块,uWSGI实现了WSGI的所有接口,是一个快速,自我修复,开发人员和系统管理员友好的服务器,C语言编写,效率高

Nginx

使用nginx的的作用主要包括负载均衡,反向代理

项目通过Django+Uwsgi+Nginx进行线上服务器部署

1、文件打包传服务器,通过xshell

文件 > 传输 > ZMODEM > 用ZMODEM发送 > 文件或压缩包

Linux下压缩包解压命令:

zip格式 : unzip 压缩包路径

tar.gz格式 : tar zxvf 压缩包路径

(rar格式压缩包解压较为复杂,尽量别传rar格式)

2、Xshell使用技巧

文件 > 新建,开启多终端

建议开多终端,这样对uwsgi、Nginx、项目代码进行调试修改时,可以避免在一个终端下来回切换目录,提高工作效率,具体开终端的个数根据实际需求来定,并且右击tab终端名重命名,更加方便知道哪个终端对应做哪些事情
未分类

3、修改配置文件问题

不管修改uwsgi的配置文件uwsgi.ini还是修改nginx配置文件nginx.conf,修改完都必须重启服务才能生效,并且启动服务要在指定的目录下面重启

4、Uwsgi的安装

方法1、pip install uwsgi(有网的情况下)

方法2、没网情况下去官网下载uwsgi压缩包,为tar.gz格式,传到服务器,进行解压,解压路径/lib/目录下面,然后切换到uwsgi文件目录,执行以下两个命令,即可完成安装,示意图如下(解压路径可以自定义,记下来,方便以后进行维护)

python setup.py  build

python setup.py  install

未分类

5、Django项目中配置uwsgi

1、项目目录(例如本例中DataBusines)下创建uwsgi.ini文件,配置如下

本地测试一般用:127.0.0.1即可,端口可以自定
未分类

线上的话用线上服务器IP,端口自定,该配置访问地址需要和nginx.conf中的配置一样
未分类
例如:这是后面的nginx.conf配置文件,两者地址和端口需要一致
未分类

6、Uwsgi的使用(启动、查看进程、关闭)

启动uwsgi.ini,需要切换到项目目录

启动uwsgi: uwsgi –ini uwsgi.ini

查看uwsgi进程:ps ajx|grep uwsgi

关闭uwsgi:

查阅相关资料文档,提到多种命令关闭方式,关闭命令的意义在于修改配置文件后,

一般需要重启uwsgi才会生效

1、uwsgi –stop uwsgi.pid(不好用,经常报pid找不到)

2、sudo pkill -f uwsgi -9(不好用,有可能报错,无效的-9)

3、killall -9 uwsgi(该命令最好用)
未分类

7、通过uwsgi网页访问

因为uwsgi本身就是web服务器,我们可以通过更改配置直接通过uwsgi进行访问网页

如下图:我们在服务器通过vi更改配置文件为http请求模式,更改后保存并重启uwsgi服务器,在我们自己的浏览器访问设置的IP和端口,成功显示页面,证明uwsgi配置成功

http模式: 直接用uwsgi时使用

socket模式: 使用Nginx时使用
未分类
未分类

8、Nginx的安装

方法1、pip install nginx(官方提供有该方法,但是之前在本地测试遇到坑,没有配好,建议通过方法二中压缩包方式安装)

方法2、没网情况下去官网下载nginx压缩包,为tar.gz格式,传到服务器,进行解压,解压路径/lib/目录下面,然后切换到nginx文件目录,执行以下三个命令,进行安装

./configure

make

sudo make install

未分类
执行完以上命令后,nginx被安装在了/usr/local/nginx/,安装成功
未分类

9、nginx的使用(启动、查看进程、关闭)

进入nginx安装目录:cd /usr/local/nginx/

启动nginx: sudo sbin/nginx

查看nginx进程: ps ajx|grep nginx

关闭uwsgi:

查阅相关资料文档,提到多种命令关闭方式,关闭命令的意义在于修改配置文件后,一般需要重启nginx才会生效

1、sudo sbin/nginx –s stop(不好用,报异常无效的-s)

2、sudo pkill -f uwsgi -9(不好用,报错,无效的-9)

3、killall -9 nginx(该命令最好用)

命令报错示意
未分类

10、nginx的配置文件nginx.conf配置

具体如图中所示,配置文件目录/usr/local/nginx/conf/nginx.conf,配置文件的修改需要通过vi进行修改
未分类
未分类

11、静态资源配置

配置静态资源目录是因为让静态资源通过nginx可以直接返回,不需要通过uwsgi,也就是让uwsgi只处理后端逻辑,不处理静态资源,优化性能

1、静态资源在nginx.conf中的配置,路径可以自定义
未分类
2、在服务器上创建如下目录

sudomkdir –vp /var/www/DataBusines/static/

3、修改目录权限

sudochmod 777 /var/www/DataBusiness/static/

4、项目代码中配置settings,加入该目录(本地演示在IDE中,线上可以用vi)
未分类

5、收集所有静态文件到static_root指定目录

服务器上切换到项目目录(DataBusines),执行如下命令收集

python  manage.py collectstatic

6、查看静态资源目录
未分类

12、更改uwsgi.ini配置

刚才在做uwsgi时候,用了http配置,现在nginx正式搭建起来,需要改成socket配置,修改完毕要重启uwsgi
未分类
Settings.py需要debug设置为不调试,允许访问的地址设置为服务器地址
未分类
以上步骤完成后,访问服务器主机地址和端口,如果nginx.conf中配置的为80端口,则地址栏不需要输入端口,因为浏览器请求端口也是默认为80端口,非80端口的需要自己在ip后面添加
未分类

在阿里云上Ubuntu环境通过nginx+uwsgi部署Django项目

年前阿里云打折,1核1G的云服务器一年只要300多块,果断就租了1年的。既然服务器已经到手,怎么能不把自己写的项目部署上去呢,其实网上关于nginx+uwsgi部署Django项目的文章有很多,但是这些文章要不就是很久之前的,要不就是互相抄袭,一路过来都是坑,这里重点吧在部署时候遇到的坑着重介绍一下:

1. 首先部署django项目

首先是django项目,由于我是使用Anaconda来进行版本控制的,而django项目是在Python2.7环境下开发的,首先是新建一个Python2.7的环境:

#创建python27环境
conda create --name python27 python=2.7
#激活该环境
source activate python27
#通过conda安装django
conda install django

环境准备好后,从GitHub上将项目拉取下来

git clone https://github.com/sunny0826/xxx

修改setting.py文件

#debug模式默认开启,这里要关闭
DEBUG = False
#这里将外网IP配置进来
ALLOWED_HOSTS = ['127.0.0.1','xx.xx.xx.xx']

启动项目:

#来项目目录下执行
python manage.py runserver 8000

然后在外网ip:8000路径下查看项目启动情况

2. 阿里云配置安全组

由于是服务器在阿里云上,所以直接访问时访问不到的,所以要在阿里云平台配置安全组(类似于防火墙)

首先打开阿里云平台,登录,点击安全组配置:

未分类

点击配置规则

未分类

点击添加安全组规则

未分类

按要求填写安全组规则

未分类

优先级1位最高优先级,端口可以设置范围,并且可以设置授权访问的对象
设置完之后,就可以在公网IP访问到我们的django项目了

3. 安装配置uwsgi

确定django项目可以正常运行了,ctrl+c停止项目,下面我们来安装uwsgi:
在安装uwsgi非常简单,只需要pip安装即可,但是由于之前使用的是Python27环境,这里记得要激活Python27环境,否则就安装到默认的Python路径了

#uWSGI 是一个(巨大的) C 应用,所以你需要一个 C 编译器(比如 gcc 或者 clang)和 Python 开发版头文件
apt-get install build-essential python-dev
#安装uwsgi
pip install uwsgi

按照官网介绍,写已经Python脚本进行测试,test.py(在任意路径都可以,不过测完要记得删掉)

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"]

然后输入命令进行测试

uwsgi --http :8000 --wsgi-file test.py

这里是8000端口,因为之前测试django的时候打开的8000端口,这里偷懒就不去配置新的安全组了
那么问题就来了,在启动的时候报错了….=。=

未分类

出现的这个错误,经过测试只会在Python2.7的环境发生,在Python3+就没有发生了,辗转百度和Google,都没有找到这个问题的解决办法且这个问题一般发生在nginx上…
但这个报错问题还是很明显,就是libpcre.so.1这个文件找不到,初步推测为版本问题
首先要咱们搜索一下这个文件,看看本机有没有

未分类

发现本机是有这个文件的,那就好办了,将他链接到相应位置就好

未分类

执行这条语句之后就可以uwsgi就可以正常启动了

在跳过这个坑之后,就可以正式来配置我们的项目了
首先修改自己项目中的wsgi.py文件,添加两行代码

未分类

然后在django项目根目录创建uwsgi.ini文件

uwsgi.ini文件配置

# uwsgi.ini file
[uwsgi]

# Django-related settings

socket = 127.0.0.1:8000            #与nginx通信的地址和端口

# the base directory (full path)
chdir           = /apps/xxxx        #django项目绝对路径

# Django s wsgi file
module          = xxxx.wsgi    #wsgi文件所在的相对于项目的路径

# the virtualenv (full path)
home            =  /root/anaconda3/envs/python27/lib/python2.7/site-packages        #python环境的路径

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

plugins=python
#log文件
daemonize=/apps/uwsgi/uwsgi.log
#pid文件
pidfile=/apps/uwsgi/uwsgi.pid

这里配置日志文件和pid文件,方便之后的重启

关于uwsgi的重启问题:

每次项目有代码更新的话,都需要重启uwsgi,如果没有配置pid文件的话,重启需要使用:

#查看uwsgi进程号
ps aux | grep uwsgi
#关闭进程号为0的进程
kill -9 主进程号

未分类

来停止uwsgi,然后才能重启,注意这里的主进程是pid为1的进程,而配置了pid文件的,只需要进行如下方法来重启即可

#重载(一般修改参数,或者修改py文件经常用到)
uwsgi --reload uwsgi.pid
#重启(一般系统环境变化会用到)
uwsgi --stop uwsgi.pid

最后在项目根目录下运行uwsgi命令,载入配置文件

uwsgi --ini uwsgi.ini

然后在后面的日志中要注意环境是否为之前配置,如果不是请激活激活之前创建的Python环境再进行操作

4. 安装配置nginx

最后来安装nginx

sudo apt-get install nginx

修改nginx配置

cd /etc/nginx/sites-enabled    #Ubuntu中nginx配置文件所在路径
vim default

配置文件

server {
        listen 80 default_server;            #监听端口,将来访问的端口
        listen [::]:80 default_server;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;


        server_name _;

        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:8000;    #uwsgi中配置的路径
        }

        location /static {
                alias /apps/xxx/static;       #静态资源路径
        }

        location /resume.ico  {
                alias /apps/xxx/static/resume.ico;    #网页图标路径
        }
}

uwsgi启动后,再启动nginx

基础命令

/etc/init.d/nginx start  #启动
/etc/init.d/nginx stop  #关闭
/etc/init.d/nginx restart  #重启

启动之后,访问外网IP:80,查看是否可以通过nginx访问django

nginx+uwsgi在centos上部署Django应用

背景介绍:

之前做完一个Django项目,打算部署在自己的centos服务器上,可以远程访问,于是命令行上输入

python manage.py runserver 0:8000

就成功运行了,可惜,django自带的web服务器并不稳定,经常无缘无故断掉,于是想到

使用主流的uwsgi+nginx来部署项目,

至于Nginx+uWSGI+Django原理可参考http://www.cnblogs.com/Xjng/p/aa4dd23918359c6414d54e4b972e9081.html

此处就不赘述了,下面介绍下具体部署步骤

1. 安装uwsgi

pip install uwsgi

此时可以尝试使用uwsgi来启动应用,其中wsgi.py在mysite文件夹下

uwsgi --http :8000 --module mysite.wsgi

在浏览其中输入127.0.0.1:8080 能够成功访问,说明你的应用服务器部署成功,已经可以对外提供服务。

2. 安装nginx

yum install nginx

在/etc/nginx/conf.d文件夹下新建nginx启动的配置文件mysite.conf,输入以下信息

server {
  listen 8000;  #启动的nginx进程监听请求的端口
  server_name localhost;   #域名
  location / {
    include /etc/nginx/uwsgi_params;
    uwsgi_pass 127.0.0.1:8001;  #对于动态请求,转发到本机的8001端口,也就是uwsgi监听的端口
  }

  location /static/ {
    alias /home/Maximum/vacancy/static/;    #设定静态文件所在目录
  }
}

3. 同步静态文件到nginx设置的目录下

在django项目setting.py中增加

BASE_DIR = os.path.dirname(__file__)
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'..','vacancy','static')
然后在命令行行下执行

python manage.py collectstatic

4. 配置uwsgi

项目根目录下创建uwsgi.ini文件

vi uwsgi.ini
uwsgi.ini内容

[uwsgi]
# Django's wsgi file
module = mysite.wsgi
pythonpath = /usr/local/lib/python3.5/site-packages
socket = 127.0.0.1:8001
pidfile = /home/Maximum/uwsgi.pid    
daemonize = /home/Maximum/uwsgi.log

介绍下uwsgi和nginx相关命令

启动uwsgi:uwsgi --ini uwsgi.ini
停止uwsgi:uwsgi --stop uwsgi.pid
重新加载配置:uwsgi --reload uwsgi.pid
启动nginx:service nginx start
停止nginx:service nginx stop
重启nginx:service nginx restart

接下来启动uwsgi:

uwsgi --ini uwsgi.ini

启动nginx

service nginx start

此时没问题的话就大功告成了,访问173.199.118.8:8000/vacancies即可看到我们运行的项目了

遇到的坑

1、启动nginx时出现以下错误,可知端口已被占用

[gaarai@linode /etc/nginx]$ service nginx restart
 * Restarting nginx nginx
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)

解决方法:

netstat -ntpl

查看当前运行的端口以及程序,内容类似如下:

[root@vultr mysite]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1502/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      461/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      677/master
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      1502/nginx: master
tcp        0      0 127.0.0.1:8001          0.0.0.0:*               LISTEN      1475/uwsgi
tcp6       0      0 :::3306                 :::*                    LIS

将使用进程端口80,8000,8001的进程PID关闭,uwsgi的进程需要强制关闭

[root@vultr mysite]# kill -9 1475
[root@vultr mysite]# kill 1502

重新启动uwsgi和nginx

[root@vultr mysite]# uwsgi --ini uwsgi.ini
[root@vultr mysite]# service nginx start

2、访问网站出现Internal Server Error错误

查看uwsgi.log日志文件

tail -30 uwsgi.log

日志里出现

unable to load app 0 (mountpoint='') (callable not found or import error)

错误,

尝试执行

uwsgi --http :8000 --module mysite.wsgi

访问173.199.118.8:8000/vacancies运行正常,可知是uwsgi.ini配置文件有误

参考链接Setting up django with uwsgi and nginx

解决办法:

修改uwsgi.ini文件为

[uwsgi]
# Django's wsgi file
module = mysite.wsgi
pythonpath = /usr/local/lib/python3.5/site-packages
socket = 127.0.0.1:8001
pidfile = /home/Maximum/uwsgi.pid    
daemonize = /home/Maximum/uwsgi.log

之前有一些不太懂的设置加了上去,运行错误,去掉之后重启uwsgi和nginx服务即运行正常,

果然自己不太懂的设置还是不能乱加

以上就是