在前面的章节中我们使用 python manage.py runserver 来运行服务器。这只适用测试环境中使用。
正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, lighttpd等,本文将以 Nginx 为例。
Centos 下安装步骤如下:
yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
pip3 install django==2.1.4
测试 django 是否正常,运行:
django-admin.py startproject demosite
cd demosite
python3 manage.py runserver 0.0.0.0:8002
在浏览器内输入:http://127.0.0.1:8002,检查django是否运行正常。
系统平台:CentOS release 6.6 (Final) 64位。
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
PCRE 作用是让 Nginx 支持 Rewrite 功能。
1、先cd到/usr/local/src下面,再下载 PCRE 安装包,下载地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
2、解压安装包:
[root@bogon src]# tar zxvf pcre-8.35.tar.gz
3、进入安装包目录
[root@bogon src]# cd pcre-8.35
4、编译安装
[root@bogon pcre-8.35]# ./configure
[root@bogon pcre-8.35]# make && make install
5、查看pcre版本
[root@bogon pcre-8.35]# pcre-config --version
注意:这里的目录一定要cd到/usr/local/src/下再下载!!!
1、下载 Nginx,下载地址:http://nginx.org/download/nginx-1.6.2.tar.gz
[root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
2、解压安装包
[root@bogon src]# tar zxvf nginx-1.6.2.tar.gz
3、进入安装包目录
[root@bogon src]# cd nginx-1.6.2
4、编译安装
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make
make install
5、查看nginx版本
/usr/local/webserver/nginx/sbin/nginx -v
到此,nginx安装完成。
创建 Nginx 运行使用的用户 www:
[root@bogon conf]# /usr/sbin/groupadd www
[root@bogon conf]# /usr/sbin/useradd -g www www
配置nginx.conf ,将/usr/local/webserver/nginx/conf/nginx.conf替换为以下内容
[root@bogon conf]# cat /usr/local/webserver/nginx/conf/nginx.conf
user www www;
worker_processes 2; #设置值和CPU核心数一致
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m;
#下面是server虚拟主机的配置
server
{
listen 80;#监听端口
server_name localhost;#域名
index index.html index.htm index.php;
root /usr/local/webserver/nginx/html;#站点目录
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 30d;
# access_log off;
}
location ~ .*\.(js|css)?$
{
expires 15d;
# access_log off;
}
access_log off;
}
}
后面这一块server完全替换!!
检查配置文件nginx.conf的正确性命令:
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -t
Nginx 启动命令如下:
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx
从浏览器访问我们配置的站点ip:
以下包含了 Nginx 常用的几个命令:
/usr/local/webserver/nginx/sbin/nginx -s reload # 重新载入配置文件
/usr/local/webserver/nginx/sbin/nginx -s reopen # 重启 Nginx
/usr/local/webserver/nginx/sbin/nginx -s stop # 停止 Nginx
uwsgi支持ini、xml等多种配置方式,本文以 ini 为例, 在/etc/目录下新建uwsgi8001.ini,添加如下配置:
[uwsgi]
#pythonpath = /usr/local/lib/python2.7/site-packages //因为python重新安装过的,所以目录要指定到这个
pythonpath = /usr/local/lib/python3.6/site-packages
socket = 127.0.0.1:8001
master = true //主进程
vhost = true //多站模式
no-site = true //多站模式时不设置入口模块和文件
workers = 2 //子进程数
reload-mercy = 10
vacuum = true //退出、重启时清理文件
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi8001.pid //pid文件,用于下面的脚本启动、停止该进程
daemonize = /website/uwsgi8001.log
//因为python重新安装过的,所以目录要指定到这个
另外要新建一个/website目录,否则也会报错!!
找到nginx的安装目录(如:/usr/local/nginx/),打开conf/nginx.conf文件,修改server配置:
server {
listen 80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090; //必须和uwsgi中的设置一致
uwsgi_param UWSGI_SCRIPT demosite.wsgi; //入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录
uwsgi_param UWSGI_CHDIR /root/Penn/demosite/; //项目根目录!!!
index index.html index.htm;
client_max_body_size 35m;
}
}
你可以阅读 Nginx 安装配置 了解更多内容。
设置完成后,在终端运行:
uwsgi --ini /etc/uwsgi8001.ini &
/usr/local/webserver/nginx/sbin/nginx
在浏览器输入:http://网址(如果要用域名,则要在settings.py中配置允许域名列表),你就可以看到 django 的 "It work" 了。
原来以为这样就好了,其实还有一个坑,静态资源没有配置,导致admin界面进去之后都是丢失了css样式的
解决步骤:
在/website目录下新建目录static
修改项目目录下settings.py,增加下面这行:
STATIC_ROOT = '/website/static/'
再在nginx里给这个目录取一个别名
location /static {
alias /website/static/;
}
意思就是外部访问我的 域名/static 时候就可以访问到/website/static这个目录
再在项目目录下,使用python manage.py collectstatic,将项目需要的静态资源搜集到指定的STATIC_ROOT对应的目录下。也即是这个nginx刚刚取了别名的目录/website/static/。
杀掉进程里的uwsgi和nginx,重新启动
才成功!
还有一个坑,图片的上传
需要在admin的models下有个能上传图片的表,在models.py中定义表结构如下
class Shop(models.Model):
name = models.CharField(max_length=200)
lat = models.FloatField(default=0)
lng = models.FloatField(default=0)
addr = models.CharField(max_length=500)
phone = models.CharField(max_length=20)
imgUrl = models.ImageField(u'图片',upload_to='uploadImages')
status = models.IntegerField(default=0)
notes = models.CharField(max_length=500)
addDate = models.DateTimeField(u'添加时间', auto_now_add=True, editable=True)
updateTime = models.DateTimeField(u'更新时间', auto_now=True, null=True)
在settings.py中设置一下media的路径
MEDIA_ROOT = '/website/media'
MEDIA_URL = '/media/'
在admin.py下新加一条注册模型的语句
admin.site.register([Test,Shop])
同时在website目录下新建media目录
在nginx的配置文件中同样的新建一个media对应的别名
location /media{
alias /website/media/;
}
在项目根目录下执行以下指令,来重新生成数据库
python3 manage.py makemigrations WxModel # 让 Django 知道我们在我们的模型有一些变更
python3 manage.py migrate WxModel # 创建表结构
另外还缺少一个Pillow的库,是要使用ImageField类型的字段需要的一个图形库,使用pip安装
pip3 install Pillow
重启nginx和uwsgi后成功