说实在的第一次用服务器来部署django确实有点不知所措,上网查了一些资料,准备部署一个nginx+gunicorn+django+mysql的一个博客系统。
用户环境
服务器:阿里云服务器ECS
镜像系统:ubuntu16.04 64位
准备建立:nginx+gunicorn+django+mysql的博客系统
首先登陆到云服务器,也不知道先干什么,那么先更新一下吧
sudo apt-get update
sudo apt-get upgrade
中间可能会询问一些问题,输入y即可。
nginx
简单介绍一下,nginx是一个轻量级的高性能的web服务器,反向代理服务器以及邮件服务器。首先来配置一下nginx
sudo apt-get install nginx
一阵等待之后nginx就安装好了,首先来看一下nginx.conf配置
# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
这一段代码是安装nginx后的nginx的默认配置,关于nginx的配置优化后续再讲,现在重要的是将服务器给搭建起来,首先简单的讲解一下
在默认配置中,nginx总共分为四个部分:
- 全局设置,主要用来设置nginx的相关配置,比如设定nginx运行的用户和用户组、运行的进程数、运行的文件等。该部分设置在{}之外。
- events设置,从字面理解,events就是事件的意思,这里是设置事件的相关配置,如事件处理方式是epoll还是select、单个进程的最大连接数,网络IO模型等。
- http设置,这里是http服务器的相关配置,从默认配置看,大致有五种,基本配置、SSL配置、Log配置、Gzip配置以及虚拟端口设置。这里我们先看虚拟端口这只,这里用include引入了两个文件,/etc/nginx/conf.d/*.conf 和/etc/nginx/site-enabled/*。我这里就直接将我自己的服务器配置放在conf.d/blog.conf文件中。
server {
listen 80;
server_name final-skynet.xin;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这段代码的意思是nginx监听80端口,服务器的地址是final-skynet.xin,location是一个匹配规则,匹配到监听的url,具体的匹配规则这里就不详细赘述了。匹配成功后,转发到本地的http://127.0.0.1:8080地址,这是gunicorn监听的地址,然后设置其他需要转发的内容。
- 最后一个是mail设置,由于本项目现在还用不着,所以就将默认的代码注释删除了。nginx的基本配置就到这里了。
安装gunicorn和django
sudo pip install gunicorn
sudo apt-get install django
输入上述命令就可以安装好django和gunicorn了,这里先简单的配置一下django,创建一个简单的blog应用。
- 创建新项目
django-admin startproject SkyNet
在根目录输入该命令就可以创建一个新的django项目SkyNet,然后创建一个新的blog应用
进入SkyNet文件夹可以看到该文件夹的目录结构如下
/SkyNet
manage.py
/SkyNet
__init__.py
settings.py
urls.py
wsgi.py
然后在SkyNet目录下运行以下命令
python manage.py startapp blog
然后可以看见SkyNet目录下多了一个blog的文件夹,这个就是新创建的blog app
- 创建index页面
那先创建一个index页面来验证一下我们的配置。
- 在urls.py中进行配置
from django.conf.urls import url
from django.contrib import admin
from blog.views import *
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$',index,name='index')
]
- 创建index视图
from __future__ import unicode_literals
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello , this is my first index')
现在需要在INSTALL_APPS配置创建的app和gunicorn
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'gunicorn',
'blog',
]
下面需要通过gunicorn来启动django
gunicorn Skynet.wsgi:application -b 127.0.0.1:8080
最后在浏览器中输入网址进行验证
可能你需要重启一下你的nginx
讲到这个地方,云服务的环境部署应该是告一段落了
但是呢,在文章的开头,需要建立的是nginx+gunicorn+django+mysql的一个服务器,剩下的就是mysql的安装了
sudo apt-get install mysql-server
然后在安装的过程中提示需要设置密码,这个时候你可以选择设置密码,或者直接选择OK跳过。
我在这里是选择的跳过,安装完毕验证一下数据是否安装成功。由于我这里没有设置密码,故直接输入mysql就进入了mysql的命令行,设置密码的可以输入
mysql -u root -p
然后输入密码进入命令行。
在mysql创建数据库的时候经常出现编码问题,这里我先解决一下mysql的编码问题,在/etc/mysql/my.cnf中引用了conf.d中的文件,所以直接在/etc/mysql/conf.d/mysql.cnf进行修改。
首先查看一下mysql的编码,进入mysql命令行
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
//或者
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.19, for Linux (x86_64) using EditLine wrapper
Connection id: 4
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.19-0ubuntu0.16.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 1 min 16 sec
可以看到db和server的characterset都默认为latin1,这里需要设置[mysqld]的character-set-server = utf8即可
//mysql.cnf
[mysqld]
character-set-server = utf8
然后重启mysql服务,在命令行输入
service mysql restart
然后重新查看,可以看到mysql的默认编码已经改过来了。
如果你不想这么麻烦,可以在创建数据库的时候设置编码为utf8即可
如下命令
CREATE DATABSE db_name DEFUALT CHARACTER SET utf8;
下面在django中配置mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER': 'root',
'PASSWORD': '',
'HOST':'',
'PORT':'',
}
}
这里由于我的mysql用户没有设置密码所以,password为空,后续再进行设置
先需要在mysql中创建数据库。
CREATE DATABASE blog;
这个时候django还没有和mysql连接起来,需要安装mysqlclient或者MySQL-python,我在这里安装的是mysqlclient,在安装mysqlclient之前还需要安装libmysqlclient-dev
sudo apt-get install libmysqlclient-dev
pip install mysqlclient
这个时候就可以用django的数据迁移
python manage.py makemigrations
python manage.py migrate
这个时候进入mysql命令行,查看blog数据库中是否插入了django数据迁移来的数据库表
mysql> use blog
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_blog |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
10 rows in set (0.00 sec)
看到数据库中的表就可以指导mysql已经配置完成了。
这样SkyNet的服务器配置基本上就完成了。后面需要解决一下代码上传和nginx等优化的问题。