因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新。请访问我的个人网站获取这篇文章的最新内容,CentOS 环境下基于 Nginx uwsgi 搭建 Django 站点

以下用一个网站 ocean_monitor 举例

MySQL 安装与配置

安装

MariaDB is shipped in the CentOS repo as of CentOS 7 instead of mysql.

if you still want to install mysql you need to add mysql rpm dependency into your yum repo.

sudo yum -y install mariadb-server mariadb-devel mariadb
sudo systemctl start mariadb.service
sudo systemctl enable mariadb.service

配置

登录

mysql -u root -p

创建用户

CREATE USER ocean_monitor IDENTIFIED BY 'ocean_monitor_pwd';

上面建立的用户可以在任何地方登陆。如果要限制在固定地址登陆,比如 localhost 登陆:

CREATE USER ocean_monitor@localhost IDENTIFIED BY 'ocean_monitor_pwd';

创建数据库

# 使用utf8编码,否则中文会有问题
CREATE DATABASE ocean_monitor character set utf8;

授权 ocean_monitor 用户拥有 ocean_monitor 数据库的所有权限

grant all on ocean_monitor.* to ocean_monitor identified by 'ocean_monitor_pwd';

如果是限制在 localhost 登录的,则使用

grant all on ocean_monitor.* to ocean_monitor@localhost identified by 'ocean_monitor_pwd';

使用 PIP 安装依赖

为mysql-python安装依赖,这样才能编译安装

如果是Ubuntu用户

sudo apt-get install build-essential python-dev libmysqlclient-dev python-mysqldb

如果是Centos用户

yum install gcc python-devel

安装所有的依赖

# requirements.txt 是 django 项目目录下,填写的依赖包信息
pip install -r requirements.txt

测试 uWSGU

创建一个测试文件

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

然后,Run uWSGI:

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

如果出现错误,!!! no internal routing support, rebuild with pcre support !!!

sudo apt-get install libpcre3 libpcre3-dev
sudo pip uninstall uwsgi
sudo apt-get remove uwsgi
sudo pip install uwsgi

打开下面url,浏览器上应该显示hello world

http://example.com:8000

如果显示正确,说明下面3个环节是通畅的:

the web client <-> uWSGI <-> Python

测试Django

我看别人用的是 --module mysite.wsgi,但是建 Django项目时,并没有生成这个文件,这里十分奇怪。因此,使用 Django 生成的 wsgi.py

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

如果显示正确,说明下面3个环节是通畅的:

the web client <-> uWSGI <-> Django

Nginx 安装与配置

Nginx 安装

http://cantgis.blog.51cto.com/5788192/1540004

配置站点

vim /etc/nginx/conf.d/ocean_monitor.conf

添加配置信息

# ocean_monitor.conf

# the upstream component nginx needs to connect to
upstream django_ocean_monitor {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
# for a web port socket (we'll use this first)
server 127.0.0.1:8108;
} # configuration of the server
server {
# the port your site will be served on
listen 8008;
# the domain name it will serve for
# substitute your machine's IP address or FQDN
# Django 的 settings.py 文件中的 ALLOWED_HOSTS 要加上这里设置的 server_name
server_name localhost;
charset utf-8; gzip on;
gzip_min_length 1000;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_vary on;
# 禁用对 IE 6 使用 gzip 压缩
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/xml+rss application/json; ## Individual nginx logs
access_log /var/log/nginx/ocean_monitor_access.log;
error_log /var/log/nginx/ocean_monitor_error.log; # max upload size
client_max_body_size 8M; # adjust to taste # Django media
location /media {
# your Django project's media files - amend as required
alias /home/python/ocean_monitor/media;
} location /static {
# your Django project's static files - amend as required
alias /home/python/ocean_monitor/static;
} # Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django_ocean_monitor;
# the uwsgi_params file you installed
# 增加 nginx 配置, uwsgi_params 文件在 /etc/nginx/ 目录下
include /etc/nginx/uwsgi_params;
}
}

测试 nginx 的配置文件的语法是否正确

sudo nginx -t

重启 nginx

service nginx restart

Django 配置

settings.py 配置

设置 ALLOWED_HOSTS

Django gives Bad Request (400) when DEBUG = False

The ALLOWED_HOSTS list should contain fully qualified host names, not urls. Leave of the port and the protocol. If you are using 127.0.0.1, I'd add localhost to the list too

ALLOWED_HOSTS = [
# 加上本机的IP地址
'192.168.137.146',
'127.0.0.1',
'localhost'
]

You could also use * to match any host:

ALLOWED_HOSTS = ['*']

设置 DATABASES

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'ocean_monitor',
'USER': 'ocean_monitor',
'PASSWORD': 'ocean_monitor_pwd',
'HOST': 'localhost',
'PORT': '3306',
}
}

初始化数据库

python manage.py syncdb

启动一下,测试 Django 有没有问题

python manage.py runserver 0.0.0.0:8080

uWSGI 配置文件

在 Django 项目的根目录添加 uwsgi.ini 文件

# uwsgi.ini file
[uwsgi] # Django-related settings
# the base directory (full path)
chdir = /home/python/ocean_monitor
# Django's wsgi file
wsgi-file = /home/python/ocean_monitor/ocean_monitor/wsgi.py
# module = index.wsgi:application
# the virtualenv (full path)
# home = /path/to/virtualenv
daemonize = /home/python/ocean_monitor/ocean_monitor.log
# process-related settings
# master
master = true
pidfile = /tmp/ocean_monitor_master.pid
# maximum number of worker processes
processes = 3
# the socket (use the full path to be safe
# socket = /home/python/ocean_monitor/ocean_monitor.sock
socket = 127.0.0.1:8108
# ... with appropriate permissions - may be needed
chmod-socket = 664
# clear environment on exit
vacuum = true

uwsgi 启动与结束

# 启动
uwsgi --ini uwsgi.ini
# 重启
uwsgi --reload /tmp/ocean_monitor_master.pid
# 结束
uwsgi --stop /tmp/ocean_monitor_master.pid

如果出现错误 signal_pidfile()/kill(): No such process [core/uwsgi.c line 1627],是由于 ocean_monitor_master.pid 的进程ID不正确,修改/tmp/ocean_monitor_master.pid为正确的pid就可以。

使用如下命令,查询指定端口的进程id

sudo netstat -ap | grep 8108

修改 /tmp/ocean_monitor_master.pid 的进程id值

vim /tmp/ocean_monitor_master.pid

使用 supervisor 启动 celery-worker 及 celery-beat

安装 supervisor

安装

pip install supervisor

安装方法请参考

http://www.iitshare.com/supervisord-manage-process.html

生成配置文件

安装好supervisor之后,默认是没有生成配置文件的。可以通过以下命令生成配置文件

echo_supervisord_conf > /etc/supervisord.conf

启动

supervisord -c /etc/supervisord.conf  # 到指定路径下去找配置文件

如果出现

another program is already listening on a port that one of our HTTP servers is configured to use

sudo unlink /etc/supervisor.sock

然后再次运行

supervisord -c /etc/supervisord.conf

supervisor 管理

supervisor 安装完成后有两个可用的命令行 supervisor 和 supervisorctl,命令使用解释如下:

supervisord,初始启动Supervisord,启动、管理配置中设置的进程。
supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx为[program:chatdemon]里配置的值,这个示例就是chatdemon。
supervisorctl start programxxx,启动某个进程
supervisorctl restart programxxx,重启某个进程
supervisorctl stop groupworker: ,重启所有属于名为groupworker这个分组的进程(start,restart同理)
supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。

注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

设置配置文件

vim /etc/supervisord.conf

在文件最后添加如下信息

[program:ocean_monitor_celery_worker]
process_name = ocean_monitor_celery_worker
command=python /home/python/ocean_monitor/manage.py celery worker --loglevel=info
directory=/home/python/ocean_monitor
autorestart=true
redirect_stderr=true
stdout_logfile = /var/log/supervisord/ocean_monitor_celery_worker.log
loglevel=info
[program:ocean_monitor_celery_beat]
process_name = ocean_monitor_celery_beat
command=python /home/python/ocean_monitor/manage.py celery beat --loglevel=info
directory=/home/python/ocean_monitor
autorestart=true
redirect_stderr=true
stdout_logfile = /var/log/supervisord/ocean_monitor_celery_beat.log
loglevel=info

用 supervisor 运行前,可以先在命令行下启动测试一下

python manage.py celery beat --loglevel=info
python manage.py celery worker --loglevel=info

启动

# 根据最新的配置文件,启动新配置或有改动的进程
# 配置没有改动的进程不会受影响而重启
supervisorctl update

防火墙设置及 SELinux 问题

设置防火墙开放端口(iptables)

/sbin/iptables -I INPUT -p tcp --dport 8008 -j ACCEPT

nginx permission denied 问题

因为忘记了 selinux 的问题,导致 trouble shooting 耽误了不少时间。

由于SELinux的问题,会导致nginx nginx permission denied 的问题,需要将 selinux 关闭。

查看SELinux状态:

# 如果SELinux status参数为enabled即为开启状态
/usr/sbin/sestatus -v

也可以用 getenforce 这个命令检查

关闭SELinux

# 只是临时关闭(不用重启机器),重启后问题仍然出现
# 设置SELinux 成为permissive模式
setenforce 0
# setenforce 1 # 设置SELinux 成为enforcing模式

永久关闭,需要通过修改配置文件,但是需要重启机器:

vim /etc/selinux/config

将SELINUX=enforcing 改为 SELINUX=disabled,重启机器即可

shutdown -r now

CentOS 环境下基于 Nginx uwsgi 搭建 Django 站点的更多相关文章

  1. Windows 环境下基于 nginx 的本地 PyPI 源

    Windows 环境下基于 nginx 的本地 PyPI 源的搭建: 1.登录 nginx 官网,下载安装包

  2. windows环境下基于nginx搭建rtmp服务器

    基于nginx搭建rtmp服务器需要引入rtmp模块,引入之后需重新编译nginx linux环境几个命令行就能实现编译,笔者未尝试,网上有很多教程. windows环境还需要安装一系列的编译环境,例 ...

  3. Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)

    说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...

  4. centos7 下通过nginx+uwsgi部署django应用

    1. 安装python3.6 1. 获取 wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz tar -xzvf Python- ...

  5. Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)

    Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具) 最近因为项目关系,收朋友之托,想制作秀场网站,但是因为之前一直没有涉及到这 ...

  6. CentOS6下基于Nginx搭建mp4/flv流媒体服务器

    CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具) 1.先添加几个RPM下载源 1.1)安装RPMforge的CentOS6源 [roo ...

  7. linux系统Centos环境下搭建SVN服务器及权限配置

    linux系统Centos环境下如何搭建SVN服务器以及svnserve.conf.authz.passwd配置文件详细介绍   至于svn的概念,这里就不做详细阐述了,可以自行百度.简单来讲就是一个 ...

  8. 填坑!!!virtualenv 中 nginx + uwsgi 部署 django

    一.为什么会有这篇文章 第一次接触 uwsgi 和 nginx ,这个环境搭建,踩了太多坑,现在记录下来,让后来者少走弯路. 本来在 Ubuntu14.04 上 搭建好了环境,然后到 centos7. ...

  9. Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统

    Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...

随机推荐

  1. JS级联下拉框

    //Ajax级联获取SDKfunction GetDropDownList(parent_ddlID, fill_dllID, url, param) {    this.pId = parent_d ...

  2. Rails 5 Test Prescriptions 第14章 Testing Exteranl Services(中断。)

    external testing strategy ✅ the service integration test✅ introduce VCR✅ Client Unit Tests ❌ Why an ...

  3. ansible常用套路(一)

    一.SSH互信 1 配置/etc/ansible/hosts 文件 [zabbix_agent] 172.26.4.203 172.26.4.204 172.26.4.205 [zabbix_agen ...

  4. FZU 2169 shadow spfa

    题目链接:shadow 好佩服自己耶~~~好厉害~~~ 麻麻再也不用担心我的spfa 和 邻接表技能了~~~ spfa 记录最短路径. #include <stdio.h> #includ ...

  5. windows下搭建nginx+php+虚拟主机配置过程

    需要软件信息: nginx php RunHiddenConsole 首先安装之前要规划一下把他们放到那里,比如我将他们统一放在e :/web下 那么将这些都拷贝过来,开始吧,window要执行php ...

  6. Python 编程核心知识体系-基础|数据类型|控制流(一)

    Python知识体系思维导图: 基础知识 数据类型 1.序列 2.字符串 3.列表和元组 4.字典和集合 循环 & 判断

  7. SpringInAction--SpringMvc高级技术(servlet、filter、multipart)

    前面学了spirng的一些配置,以及web方面的知识,今天就在学习一下在spring比较常用的一些高级技术... 首先来介绍下什么叫servlet吧(来着维基百科) Servlet(Server Ap ...

  8. 浅谈ES6的let和const的异同点

    1.let和const的相同点: ① 只在声明所在的块级作用域内有效. ② 不提升,同时存在暂时性死区,只能在声明的位置后面使用. ③ 不可重复声明. 2.let和const的不同点: ① let声明 ...

  9. geek网工作室主页------我的第一个小项目

    传送门:袁咩咩的小小博客 很快,就到了大二的寒假,大学的生活就这样过去了接近一半,之前听说大二寒假会有项目什么的,已经准好了心理准备. 但第一次着手项目,还是有点小紧张 在这之前我已经看了一些框架,也 ...

  10. WPF 多线程 UI:设计一个异步加载 UI 的容器

    对于 WPF 程序,如果你有某一个 UI 控件非常复杂,很有可能会卡住主 UI,给用户软件很卡的感受.但如果此时能有一个加载动画,那么就不会感受到那么卡顿了.UI 的卡住不同于 IO 操作或者密集的 ...