澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

Django服务器平台搭建,django不难陈设

2019-11-16 作者:www.8455.com   |   浏览(153)
  1. 买云服务器,选择Ubuntu系统
  2. 设置ssh登陆, windows平台通过Putty登陆Ubuntu云服务器. [ ]
  3. 软件安装

    1. 系统软件升级和 数据库软件,服务区软件安装: Sudo apt-get update ,sudo apt-get upgrade ,sudo apt-get install mysql-server-5.7 , nignx ,python3-pip
    2. Python包安装,: pip3 install Django==1.10.5 gunicorn Django-crontab 等等 Django项目需要的python包文件
  4. Git 设置. Git用于将编写的源代码同步到服务器,这里也可以采用其他方式。只需要把编写的Django源代码传到服务器下即可。

  5. 安装 nginx , gunicorn 。Nginx 用作代理服务器 ; gunicorn 用作wsgi 服务器
  6. 配置nginx。 Nginx默认的安装目录在 /etc/nginx/.

    nginx配置文件的路径: `/etc/nginx/sites-available/` : 先把配置文件放在这里,编辑好之后,链接到目录 `/etc/nginx/sites-enable/`

    ngixn 配置文件内容:

        server{

         listen 80;

            server_name 127.0.0.1; #访问django项目的网站

            access_log /var/www/Django_project /log/nginx.access.log;#访问日志

            error_log /var/www/ Django_project /log/nginx.error.log;#错误日志    

            location /static/ {

         root /var/www/ Django_project /;

                expires 30d;

         }

            location /media/ {

         alias /var/www/ Django_project /uploads/; #Django 项目接受上传文件的目录

                expires 30d;

         }

         location / {

         #动态请求交给gunicorn,8087端口就是gunicorn用的端口

                proxy_pass ;            

                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;

                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         }

        }

  7. 启动django 工程的服务,在Django_project 工程目录下执行: gunicorn -t 120 -w 2 -b 127.0.0.1:8087 Django_project.wsgi 。 Django的setting.py中要将服务器IP地址添加到ALLOWED_HOSTS。

  8. 如果没有问题的,现在可以在客户端浏览器中输入服务器IP地址就能看到完整的页面了

     

     

    附: Mysql数据库相关命令

Django是python web框架中,最popular的一个,关于model/view/controller/模版等,各种教程非常多,现用现查即可,推荐:http://www.ziqiangxuetang.com/django/django-tutorial.html

本文记录Ubuntu 16.04 上使用Nginx、 Gunicorn、supervisor 部署django项目

、简介:

KVM WEB管理工具webvirtmgr安装和使用

根据setting.py文件的配置,创建数据库和相应的用户,需要的使用的命令如下:

django最麻烦的地方,反而是部署,下面详细聊聊。

准备工作:

  • 创建一个django项目
  • 创建一个python虚拟环境
  • 激活虚拟环境
    这里跳过准备工作,假设我已经有了一个项目DjangoBlog和一个虚拟环境alpfaceblog

Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱。虽然Tomcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多。

[摘要:临盆情况的KVM宿主机愈来愈多,须要对宿主机的状况举行调控。那里用webvirtmgr举行治理。图形化的WEB,让人能更轻易的检察kvm 宿主机的环境战操纵 1 装置支撑的硬件源 yum -y installhttp]

登陆mysql数据库客户端 mysql -u root -h localhost -p,安装mysql时,根据提示设置root账户的密码,这里使用root账号登录

1.协议:wsgi

wsgi相当于是python定制版的cgi,通用于所有的python web框架。wsgi/cgi的存在意义在于,确立了一套服务端脚本模式的标准,让服务器支持动态页面。之所以称之为协议,是因为其中只定义了接口标准,而没有规定实现方法,你可以基于任何语言/平台去实现它。

安装配置gunicorn

  • 首先切换到项目的虚拟环境
workon alpfaceblog
  • 在虚拟环境中安装gunicorn
pip install django gunicorn
  • 把 gunicorn 加入项目settings.py中的 INSTALLED_APPS
INSTALLED_APPS = (
    # ...
    'gunicorn',
)
  • 测试gunicorn是否可以正常工作
cd /var/www/Blog
sudo gunicorn -b 0.0.0.0:8888 --worker-class=gevent DjangoBlog.wsgi:application
  • 配置生产环境下的gunicorn
    创建一个bash脚本用于快速启动gunicorn的
    在项目目录下创建一个文件夹bin,然后创建gunicorn_start文件
sudo vim  gunicorn_start

添加以下内容,注意路径需要根据实际情况替换

#!/bin/bash

NAME="DjangoBlog" # 项目的名称
DJANGODIR=/var/www/Blog # 项目所在的目录
SOCKFILE=/var/www/Blog/run/gunicorn.sock # 启动gunicorn.sock使用UNIX套接字
USER=root # the user to run as
GROUP=root # the group to run as
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name

echo "Starting $NAME as `whoami`"

# 启动虚拟环境的路径
cd $DJANGODIR
source /home/parallels/.virtualenvs/alpfaceblog/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# gunicorn 安装在虚拟环境下的完整路径
exec /home/parallels/.virtualenvs/alpfaceblog/bin/gunicorn ${DJANGO_WSGI_MODULE}:application 
--name $NAME 
--workers $NUM_WORKERS 
--user=$USER --group=$GROUP 
--bind=unix:$SOCKFILE 
--log-level=debug 
--log-file=-

添加可执行权限: sudo chmod u x bin/gunicorn_start
启动gunicorn

 ./bin/gunicorn_start

二、下载安装:

生产环境的KVM宿主机越来越多,需要对宿主机的状态进行调控。这里用webvirtmgr进行管理。图形化的WEB,让人能更方便的查看kvm 宿主机的情况和操作

创建数据库 utf-8 字符编码

2.web容器

用户访问网站的行为,实际上是从服务器取得一个html文本,然后在本地浏览器进行解析。这些文本文件,就存放在服务端的web容器中,等待被用户请求。然而现代的网站,体量都很大,数据量巨大,且应用场景也多,安全性隐患也多,因此不可能全都使用静态文件来存储。现在仍然活着的web容器,都是支持cgi族协议的,也就是可以通过server脚本,实现网页动态化。

比较流行的web容器,有:apache,nginx,IIS等。虽然都是通用web容器,但是设计之初的区别,导致各自的应用场景不同。对wsgi最友好的是nginx,所以django最简便的部署方式就是做nginx映射。

安装并配置Supervisor

Superviosr是一个进程监管的工具。简而言之,Superviosr可以保证你的程序在服务器开机时自动启动以及程序意外终止时重新启动。

  • 安装
sudo apt-get install supervisor
  • 配置

supervisor的配置文件默认从/etc/supervisor/conf.d中读取

cd /etc/supervisor/conf.d

创建并编辑一个supervisor的配置文件

sudo vim alpfaceblog.conf 

添加下面内容,注意路径需要根据实际情况替换

[program:DjangoBlog]
command = /var/www/Blog/bin/django_start
user = root
autostart=true
autorestart=true

redirect_stderr = true
stdout_logfile = /root/logs/blog/robot.log
stderr_logfile=/root/logs/blog/err.log  

手动创建日志目录:

mkdir -p /root/logs/blog

上面一步我们使用了django_start,这里我们在项目的bin目录下创建下它, 路径需要根据实际情况替换:

sudo vim django_start

#!/bin/bash

NAME="DjangoBlog" # Name of the application
DJANGODIR=/var/www/Blog # Django project directory
SOCKFILE=/var/www/Blog/run/gunicorn.sock # we will communicte using this unix socket
USER=root # the user to run as
GROUP=root # the group to run as
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /home/parallels/.virtualenvs/alpfaceblog/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /home/parallels/.virtualenvs/alpfaceblog/bin/gunicorn ${DJANGO_WSGI_MODULE}:application 
--name $NAME 
--workers $NUM_WORKERS 
--user=$USER --group=$GROUP 
--bind=unix:$SOCKFILE 
--log-level=debug 
--log-file=-

通过supervisorctl工具来启用这些设置:

sudo supervisorctl update
sudo supervisorctl reload  

这里我遇到了启动错误信息:

pkg_resources.DistributionNotFound: The 'supervisor==3.2.0' distribution was

解决方法:
这是由于我把ubuntu的python默认环境改成3.5的了,其实再改回2.7就好了

切换Python版本
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 200
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100

下载nginx

1 安装支持的软件源
yum -y install
2 安装相关软件
yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx
3 从git-hub中下载相关的webvirtmgr代码
cd /usr/local/src/
git clone git://github.com/retspen/webvirtmgr.git
4 安装webvirtmgr
cd webvirtmgr/
pip install -r requirements.txt
5 安装数据库
yum install python-sqlite2
6 对django进行环境配置
 ./manage.py syncdb
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'root'): admin
Email address: 2733176200@qq.com
Password:*********
Password (again):*********
 
 ./manage.py collectstatic #生成配置文件
./manage.py createsuperuser #添加管理员账号
 
7 拷贝web到 相关目录
cd ..
mkdir -pv /var/www
cp -Rv webvirtmgr /var/www/webvirtmgr
 
8 设置ssh
ssh-keygen
ssh-copy-id 192.168.2.32
ssh 192.168.2.32 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:6080
 
9 编辑nginx配置文件
vim /etc/nginx/conf.d/webvirtmgr.conf 添加下面内容到文件中
server {
    listen 80 default_server;
 
    server_name $hostname;
    #access_log /var/log/nginx/webvirtmgr_access_log;
 
    location /static/ {
        root /var/www/webvirtmgr/webvirtmgr; # or /srv instead of /var
        expires max;
    }
 
    location / {
        proxy_pass ;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Proto $remote_addr;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_澳门新萄京官方网站,send_timeout 600;
        client_max_body_size 1024M; # Set higher depending on your needs
    }
}
 
 
mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
 
10 启动nginx
/etc/init.d/nginx restart
 
11 修改防火墙规则
/usr/sbin/setsebool httpd_can_network_connect true
 
 
12 设置 supervisor
chown -R nginx:nginx /var/www/webvirtmgr
vim /etc/supervisord.conf #在文件末尾添加
[program:webvirtmgr]
command=/usr/bin/python /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
logfile=/var/log/supervisor/webvirtmgr.log
log_stderr=true
user=nginx
 
[program:webvirtmgr-console]
command=/usr/bin/python /var/www/webvirtmgr/console/webvirtmgr-console
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=nginx
 
 
修改/var/www/webvirtmgr/conf/gunicorn.conf.py
bind = "0:8000"
 
13 设置开机启动
chkconfig supervisord on
vim /etc/rc.local
/usr/sbin/setsebool httpd_can_network_connect true
 
 
 
14 启动进程
/etc/init.d/supervisord restart
 
15查看进程
netstat -lnpt 即可以看到6080和8000已经启动
 
16 web访问

CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

3.gunicorn+nginx+django快捷部署

以下为具体操作:

1)环境准备:安装django,nginx,gunicore

sudo brew install nginx(sudo apt-get install nginx)

sudo pip install django

sudo pip install gunicorn

2)配置nginx

在/etc/nginx/sites-available/目录下创建 配置文件(文件名不限)

mac下是:/usr/local/etc/nginx/nginx.conf

server {

listen 9600;监听的服务器端口号,小于1024的端口号,需要sudo权限。由于做了gunicore映射,这里随便用个port就可以,用户实际访问时,请求的是gunicore绑定的端口。

server_name localhost;

server_name 127.0.0.1;此处应该改为公网 IP地址

access_log /opt/logs/nginx/wasp_ticket_stat.log;

error_log /opt/logs/nginx/wasp_ticket_stat_error.log;

*    location / {*

*        proxy_pass

*        proxy_set_header Host $host;*

*        proxy_set_header X-Real-IP $http_x_real_ip;*

*        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;*

*    }*

}配置结束

保存后,启动nginx:sudo nginx

3)配置gunicorn

cd到django工程目录,gunicore project.wsgi –bind 0.0.0.0:8000 –deamon或者nohup gunicore project.wsgi –bind 0.0.0.0:8000

这么做是要保证,从部署服务器logout之后,gunicorn进程仍然活动。

gunicore第一个输入,就是要找到你project的wsgi,“.”表示目录级,可以挨个文件夹去找着自带的wsgi.py在哪里,默认在project内的project同名文件夹里。

如果成功了,则可以通过server公网ip:8000来访问网站。如果绑定80端口,则可以直接使用ip来访问。注意绑定小于1024的端口号时,需要sudo权限。

安装并配置nginx

  • 安装nginx
sudo apt-get install nginx

ubantu安装完Nginx后,文件结构大致为:
  所有的配置文件都在 /etc/nginx下;
  启动程序文件在 /usr/sbin/nginx下;
  日志文件在 /var/log/nginx/下,分别是access.log和error.log;
  并且在 /etc/init.d下创建了启动脚本nginx。

sudo /etc/init.d/nginx start # 启动
sudo /etc/init.d/nginx stop # 停止
sudo /etc/init.d/nginx restart # 重启

  • 配置nginx

配置Nginx 为我们的Django应用创建一个配置文件/etc/nginx/sites-available/alpfaceblog.conf

sudo vim alpfaceblog.conf

本文记录Ubuntu 16.04 上使用Nginx、 Gunicorn、supervisor 部署django项目

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/132889.htm

查看,修改数据库编码

4.静态文件处理

如上的部署方式,做了两次web容器映射,最容易出bug的就是路径。web的开发环境肯定跟生产环境是隔离的,使用绝对路径非常蠢,运维很容易出错。且django对绝对路径进行了重定向,使用的绝对路径和系统路径并不完全一致。

相对路径由于多次映射的原因,很容易找不到/找错了,反复试验后,觉得如下配置比较轻便:

settings.py:末尾加上

STATIC_URL = '/static/'

STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static').replace('\', '/'),)

urls.py末尾加上

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

from django.contrib import staticfiles

urlpatterns = staticfiles_urlpatterns()

在项目根目录建立static/文件夹,各处用/statictest.jpg访问文件即可。

ps:从django脚本访问文件,与从模版访问是不同的。脚本访问文件的根目录是就是django项目的根目录,在views.py打印一下执行目录,一目了然:

for item in os.walk('.'):

    print item

5.跨域访问

在有些linux上,由于安全策略的关系,需要指定可用的安全ip。在settings.py里面,KNOWN_HOSTS这个list里面加上server ip

准备工作:

  • 创建一个django项目
  • 创建一个python虚拟环境
  • 激活虚拟环境
    这里跳过准备工作,假设我已经有了一个项目DjangoBlog和一个虚拟环境alpfaceblog

下载解压后放到C:nginx-1.0.4(官网这样要求的,不知道放其它盘有没有问题)

澳门新萄京官方网站 1

use database_name;

5.django for QA进阶

在测试/质量保证过程中,常常会用到基于web的任务托盘,来支撑持续集成之类的工作。当具体需求需要对大路货jekins进行深度定制时,可以考虑改用django来做任务托盘,可扩展性要强得多,对python也更友好。

1.并发

manage.py是for debug的,性能不适合用于生产环境,因此一般基于其他容器来部署。这里举gunicorn为例,根据具体业务来决定子进程个数。然后gunicorn -w 12代表建立一个12个子进程的进程池。

现代web容器都是自带排队的,建立子进程池是for 长效任务需要较长时间独占进程的情况。

2.长效任务

在任务托盘的深度定制中,很可能某个任务是要长时间运行后输出结果的。在托盘模型中,对任务的管理需要是反馈式的,且各个任务的代码完全异构,并不方便跟一般的PC脚本一样做多进程交互。

因此service上可以直接不做多进程/线程,直接在一个viess.py的接口响应里,调用一个长效任务,多个任务多次请求即可。

但是这样做会触碰到gunicorn的timeout瓶颈,导致任务中断。这时需要借助eventlet插件,来协助处理子进程阻塞的情况。

安装eventlet:sudo easy_install eventlet

部署时加参数-k ‘eventlet’

3.时间

django有个非常微弱的小坑,就是有独立的时区,并不和server时区进行同步。所以需要在setting里面手工设置一下:

TIME_ZONE = ‘Asia/Shanghai’

创建数据库

登录mysql创建一个数据库,这里创建一个名称为blog数据库:

mysql -uroot -p

create database blog charset=utf8;

配置DjangoBlog/setting.py 中数据库 相关配置,如下所示:

     DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'blog',
            'USER': 'root',
            'PASSWORD': 'root',
            'HOST': 'host',
            'PORT': 3306,
        }
    }

启动nginx.exe,然后在浏览器输入127.0.0.1即可

show variables like 'character_set_database';

安装配置gunicorn

  • 首先切换到项目的虚拟环境
workon alpfaceblog
  • 创建数据库
python manage.py makemigrations
python manage.py migrate
  • 创建超级用户
python manage.py createsuperuser
  • 收集静态文件
python manage.py collectstatic --noinput
python manage.py compress --force
  • 在虚拟环境中安装gunicorn
pip install django gunicorn
  • 把 gunicorn 加入项目settings.py中的 INSTALLED_APPS
INSTALLED_APPS = (
    # ...
    'gunicorn',
)
  • 测试gunicorn是否可以正常工作
cd /var/www/Blog
sudo gunicorn -b 0.0.0.0:8888 --worker-class=gevent DjangoBlog.wsgi:application
  • 配置生产环境下的gunicorn
    创建一个bash脚本用于快速启动gunicorn的
    在项目目录下创建一个文件夹bin,然后创建gunicorn_start文件
sudo vim  gunicorn_start

添加以下内容,注意路径需要根据实际情况替换

#!/bin/bash

NAME="DjangoBlog" # 项目的名称
DJANGODIR=/var/www/Blog # 项目所在的目录
SOCKFILE=/var/www/Blog/run/gunicorn.sock # 启动gunicorn.sock使用UNIX套接字
USER=root # the user to run as
GROUP=root # the group to run as
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name

echo "Starting $NAME as `whoami`"

# 启动虚拟环境的路径
cd $DJANGODIR
source /home/parallels/.virtualenvs/alpfaceblog/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# gunicorn 安装在虚拟环境下的完整路径
exec /home/parallels/.virtualenvs/alpfaceblog/bin/gunicorn ${DJANGO_WSGI_MODULE}:application 
--name $NAME 
--workers $NUM_WORKERS 
--user=$USER --group=$GROUP 
--bind=unix:$SOCKFILE 
--log-level=debug 
--log-file=-

添加可执行权限: sudo chmod u x bin/gunicorn_start
启动gunicorn

 ./bin/gunicorn_start

配置自己的项目测试

alter database <数据库名> character set utf8;

安装并配置Supervisor

Superviosr是一个进程监管的工具。简而言之,Superviosr可以保证你的程序在服务器开机时自动启动以及程序意外终止时重新启动。

  • 安装
sudo apt-get install supervisor
  • 配置

supervisor的配置文件默认从/etc/supervisor/conf.d中读取

cd /etc/supervisor/conf.d

创建并编辑一个supervisor的配置文件

sudo vim alpfaceblog.conf 

添加下面内容,注意路径需要根据实际情况替换

[program:DjangoBlog]
command = /var/www/Blog/bin/django_start
user = root
autostart=true
autorestart=true

redirect_stderr = true
stdout_logfile = /root/logs/blog/robot.log
stderr_logfile=/root/logs/blog/err.log  

手动创建日志目录:

mkdir -p /root/logs/blog

上面一步我们使用了django_start,这里我们在项目的bin目录下创建下它, 路径需要根据实际情况替换:

sudo vim django_start

#!/bin/bash

NAME="DjangoBlog" # Name of the application
DJANGODIR=/var/www/Blog # Django project directory
SOCKFILE=/var/www/Blog/run/gunicorn.sock # we will communicte using this unix socket
USER=root # the user to run as
GROUP=root # the group to run as
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /home/parallels/.virtualenvs/alpfaceblog/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /home/parallels/.virtualenvs/alpfaceblog/bin/gunicorn ${DJANGO_WSGI_MODULE}:application 
--name $NAME 
--workers $NUM_WORKERS 
--user=$USER --group=$GROUP 
--bind=unix:$SOCKFILE 
--log-level=debug 
--log-file=-

通过supervisorctl工具来启用这些设置:

sudo supervisorctl update
sudo supervisorctl reload  

这里我遇到了启动错误信息:

pkg_resources.DistributionNotFound: The 'supervisor==3.2.0' distribution was

解决方法:
这是由于我把ubuntu的python默认环境改成3.5的了,其实再改回2.7就好了

切换Python版本
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 200
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100

第二环节我们使用了默认的nginx.conf 。Nginx的配置文件都存于目录conf文件下,其中nginx.conf是它的主配置文件。

删除数据库

安装并配置nginx

  • 安装nginx
sudo apt-get install nginx

ubantu安装完Nginx后,文件结构大致为:
  所有的配置文件都在 /etc/nginx下;
  启动程序文件在 /usr/sbin/nginx下;
  日志文件在 /var/log/nginx/下,分别是access.log和error.log;
  并且在 /etc/init.d下创建了启动脚本nginx。

sudo /etc/init.d/nginx start # 启动
sudo /etc/init.d/nginx stop # 停止
sudo /etc/init.d/nginx restart # 重启

  • 配置nginx

配置Nginx 为我们的Django应用创建一个配置文件/etc/nginx/sites-available/alpfaceblog.conf

sudo vim alpfaceblog.conf

添加以下内容

upstream my_server {
    server unix:/var/www/Blog/run/gunicorn.sock fail_timeout=0;
}

server {

    server_name localhost;

    upstream my_server {
    server unix:/var/www/Blog/run/gunicorn.sock fail_timeout=0;
}

server {
    listen 80;
    server_name localhost;

    large_client_header_buffers 4 16k;
    client_max_body_size 300m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_buffer_size 64k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;

    root /var/www/Blog;

    keepalive_timeout 70;
    access_log /var/log/nginx/django_access.log;
    error_log /var/log/nginx/django_error.log;

    location /static {
          expires max;
          alias /var/www/Blog/collectedstatic/;
    }

    location /media  {
        alias /var/www/Blog/media/;
    }
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        if (!-f $request_filename) {
            proxy_pass http://my_server;
            break;
        }
    }

}
    root /var/www/Blog;

    listen 80;

    keepalive_timeout 70;
    access_log /var/log/nginx/django_access.log;
    error_log /var/log/nginx/django_error.log;

    location /static/ {
          expires max;
          alias /var/www/Blog/collectedstatic/;
    }

    location / {
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;

         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


        if (!-f $request_filename) {
            proxy_pass http://my_server;
            break;
        }
    }

}
  • 让nginx的配置文件生效
 sudo ln -s  /etc/nginx/sites-available/alpfaceblog.conf   /etc/nginx/sites-enabled/alpfaceblog.conf
  • 重启nginx服务器
sudo service nginx restart

以下为我加上注释并配置的新的虚拟server]

Drop database db_name;

問題:

Java代码  澳门新萄京官方网站 2

创建MYSQL 用户

nginx遇见的问题

1.最近在访问部分页面时,速度经常非常慢,导致报502 Bad Gateway错误
解决方法:
查看nginx的错误日志,我是配置在error_log /var/log/nginx/django_error.log;

日志中我发现了两个问题,第一个问题:

ubuntu@ip-172-31-17-237:/var/log/nginx$ cat django_error.log
2018/02/24 09:10:43 [error] 1132#1132: *72 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 66.249.64.22, server: www.alpface.com, request: "GET /article/2018/1/20/1.html HTTP/1.1", upstream: "http://unix:/var/www/Blog/run/gunicorn.sock/article/2018/1/20/1.html", host: "www.alpface.net"
2018/02/24 09:22:42 [error] 1132#1132: *87 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 222.249.170.75, server: www.alpface.com, request: "POST /admin/blog/article/add/ HTTP/1.1", upstream: "http://unix:/var/www/Blog/run/gunicorn.sock/admin/blog/article/add/", host: "alpface.com", referrer: "http://alpface.com/admin/blog/article/add/"

通过网友的各种尝试,我决定试一试,最终解决了,解决方法:
这是由于,NGINX反向代理的超时报错:

ubuntu@ip-172-31-17-237:/var/log/nginx$ cd /etc/nginx/sites-available/
ubuntu@ip-172-31-17-237:/etc/nginx/sites-available$ sudo vi alpfaceblog.conf 

在网站的配置文件中添加以下,并重启nginx

server {
listen 80;
server_name localhost;

    large_client_header_buffers 4 16k;  
    client_max_body_size 300m;  
    client_body_buffer_size 128k;  
    proxy_connect_timeout 600;  
    proxy_read_timeout 600;  
    proxy_send_timeout 600;  
    proxy_buffer_size 64k;  
    proxy_buffers   4 32k;  
    proxy_busy_buffers_size 64k;  
    proxy_temp_file_write_size 64k;  

    #.............................  
}  

重启:`sudo /etc/init.d/nginx restart`

第二个问题:
查看错误日志可以看到:`/var/www/Blog/media//`, media后面多了一个/, 这是由于nginx配置文件中的资源文件路径写错了导致的,修改下我的配置文件,重启nginx解决;

ubuntu@ip-172-31-17-237:/var/log/nginx$ cat django_error.log
2018/03/05 06:44:04 [error] 3493#3493: *1 upstream prematurely closed connection while reading response header from upstream, client: 222.249.170.75, server: localhost, request: "GET /article/2018/2/28/38.html HTTP/1.1", upstream: "http://unix:/var/www/Blog/run/gunicorn.sock:/article/2018/2/28/38.html", host: "www.alpface.com", referrer: "http://www.alpface.com/login/?next=/article/2018/2/28/38.html"
2018/03/05 06:51:16 [error] 3493#3493: *33 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/article/edit/?aid=32"
2018/03/05 06:51:26 [error] 3493#3493: *32 open() "/var/www/Blog/collectedstatic//blog/img/favicon.ico" failed (2: No such file or directory), client: 222.249.170.75, server: localhost, request: "GET /static/blog/img/favicon.ico HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/article/edit/?aid=32"
2018/03/05 06:56:05 [error] 3493#3493: *39 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/article/list/"
2018/03/05 06:56:09 [error] 3493#3493: *41 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/message/comment/"
2018/03/05 06:56:11 [error] 3493#3493: *41 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/message/os/"
2018/03/05 06:56:12 [error] 3493#3493: *41 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/message/comment/"
2018/03/05 06:56:15 [error] 3493#3493: *39 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/visitor/"
2018/03/05 06:56:18 [error] 3493#3493: *41 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/link/"
2018/03/05 06:56:23 [error] 3493#3493: *41 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/profile/"
2018/03/05 06:56:37 [error] 3493#3493: *41 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/profile/"
2018/03/05 06:56:40 [error] 3493#3493: *41 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/profile/"
2018/03/05 06:56:41 [error] 3493#3493: *39 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/link/"
2018/03/05 06:56:43 [error] 3493#3493: *39 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/profile/"
2018/03/05 06:56:45 [error] 3493#3493: *39 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/article/add/"
2018/03/05 06:56:52 [error] 3493#3493: *39 directory index of "/var/www/Blog/media//" is forbidden, client: 222.249.170.75, server: localhost, request: "GET /media/ HTTP/1.1", host: "www.alpface.com", referrer: "http://www.alpface.com/admin/"

##### 执行数据库迁移时遇见的问题
1. 當修改或新增model後, 執行python manage.py makemigrations,未生成遷移:
解決方法:
刪除每個app文件下migrations文件中除了__init__.py的所有文件,然後再執行`python manage.py makemigrations`重新生成遷移

2. 數據庫遷移時遇見的問題:
錯誤信息:

django.db.utils.InternalError: (1054, "Unknown column 'name' in 'django_content_type'")

解決方法:
在数据库中手动添加没有创建的字段

alter table django_content_type add column name varchar(10)

3. 遷移數據庫python manage.py migrate時出錯:

django.db.utils.InternalError: (1050, "Table 'auth_permission' already exists")

解決方法:

python manage.py migrate --fake

但是此種方法會忽略一些錯誤,導致最終還是不能解決我們的遷移的問題


總結:
我的blog項目是在我的本地電腦ubuntu系統上開發並測試的,然後提交到github上,最後部署到亞馬遜服務器時,通過git命令clone到服務器上;
期間我在本地修改或創建了一些model,這時我在本地生成遷移和遷移時都沒有,但是在服務端遷移總是報錯,導致遷移失敗;
原因:在網上查找各種資料最終都沒有解決,最後我發覺項目的.gitignore中忽略了migrations文件,而每次改變model或新增model時,都會生成一個000n_.py文件,每次改變n都會加1,
此時我的數據庫也會在遷移時發生改變,而當我在服務器執行遷移時,服務器端沒有migrations文件,每次遷移都會重新生成,那麼和本地執行時機不同,所以會需要每次執行遷移時,會根據migrations執行的結果也不同;
解決方法:當然我們可以在gitignore中取消這些忽略文件, 另外當我們在服務器段執行遷移遇到文件時,我們可以把本地的0001_initial.py中的復制到服務端對應的這個文件再執行`python manage.py makemigrations`和`python manage.py migrate`
  1. #运行用户  
  2. #user  nobody;  
  3. #开启进程数 <=CPU数  
  4. worker_processes  1;  
  5. #错误日志保存位置  
  6. #error_log  logs/error.log;  
  7. #error_log  logs/error.log  notice;  
  8. #error_log  logs/error.log  info;  
  9. #进程号保存文件  
  10. #pid        logs/nginx.pid;  
  11.    
  12. #等待事件  
  13. events {  
  14.     #Linux下打开提高性能  
  15.     #use epoll;  
  16.     #每个进程最大连接数(最大连接=连接数x进程数)  
  17.     worker_connections  1024;  
  18. }  
  19.    
  20.    
  21. http {  
  22.     #文件扩展名与文件类型映射表  
  23.     include       mime.types;  
  24.     #默认文件类型  
  25.     default_type  application/octet-stream;  
  26.     #日志文件输出格式 这个位置相于全局设置  
  27.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  28.     #                  '$status $body_bytes_sent "$http_referer" '  
  29.     #                  '"$http_user_agent" "$http_x_forwarded_for"';  
  30.        
  31.     #请求日志保存位置  
  32.     #access_log  logs/access.log  main;  
  33.        
  34.     #设定请求缓冲  
  35.     client_header_buffer_size 1k;  
  36.     large_client_header_buffers 4 4k;  
  37.    
  38.     #打开发送文件  
  39.     sendfile        on;  
  40.     #tcp_nopush     on;  
  41.    
  42.     #Django服务器平台搭建,django不难陈设。keepalive_timeout  0;  
  43.     keepalive_timeout  65;  
  44.        
  45.     #客户端上传文件大小控制  
  46.     client_max_body_size 8m;  
  47.        
  48.     #打开gzip压缩  
  49.     #gzip  on;  
  50.        
  51.     #设定负载均衡的服务器列表  
  52.     #upstream mysvr {  
  53.     #    #weigth参数表示权值,权值越高被分配到的几率越大  
  54.     #    #本机上的Squid开启3128端口  
  55.     #    #server 192.168.8.1:3128 weight=5;  
  56.     #    #server 192.168.8.2:80 weight=1;  
  57.     #    #server 192.168.8.3:80 weight=6;  
  58.     #}  
  59.    
  60.     #第一个虚拟主机  
  61.     server {  
  62.         #监听IP端口  
  63.         listen       80;  
  64.         #主机名  
  65.         server_name  localhost;  
  66.         #root    
  67.            
  68.         #设置字符集  
  69.         #charset koi8-r;  
  70.         #本虚拟server的访问日志 相当于局部变量  
  71.         #access_log  logs/host.access.log  main;  
  72.         #日志文件输出格式  
  73.         #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  74.         #                  '$status $body_bytes_sent "$http_referer" '  
  75.         #                  '"$http_user_agent" "$http_x_forwarded_for"';  
  76.            
  77.         location / {  
  78.             root   html;  
  79.             index  index.html index.htm;  
  80.         }  
  81.            
  82.         #静态文件缓存时间设置  
  83.         #location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${           
  84.         #    expires 30d;  
  85.         #}  
  86.            
  87.         #静态文件缓存时间设置  
  88.         #location ~ .*.(js|css)?${           
  89.         #    expires 1h;  
  90.         #}  
  91.            
  92.         #对本server"/"启用负载均衡  
  93.         #location / {  
  94.         #    proxy_pass ;  
  95.         #    proxy_redirect off;  
  96.         #    proxy_set_header Host $host;  
  97.         #    proxy_set_header X-Real-IP $remote_addr;  
  98.         #    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  99.         #    client_max_body_size 10m;  
  100.         #    client_body_buffer_size 128k;  
  101.         #    proxy_connect_timeout 90;  
  102.         #    proxy_send_timeout 90;  
  103.         #    proxy_read_timeout 90;  
  104.         #    proxy_buffer_size 4k;  
  105.         #    proxy_buffers 4 32k;  
  106.         #    proxy_busy_buffers_size 64k;  
  107.         #    proxy_temp_file_write_size 64k;  
  108.         #}  
  109.            
  110.         #设定查看Nginx状态的地址  
  111.         #location /NginxStatus {  
  112.         #    stub_status on;  
  113.         #    access_log on;  
  114.         #    auth_basic “NginxStatus”;  
  115.         #    auth_basic_user_file conf/htpasswd;  
  116.         #}  
  117.    
  118.    
  119.    
  120.         #error_page  404              /404.html;  
  121.    
  122.         # redirect server error pages to the static page /50x.html  
  123.         #  
  124.         error_page   500 502 503 504  /50x.html;  
  125.         location = /50x.html {  
  126.             root   html;  
  127.         }  
  128.    
  129.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
  130.         #  
  131.         #location ~ .php$ {  
  132.         #    proxy_pass   ;  
  133.         #}  
  134.    
  135.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
  136.         #  
  137.         #location ~ .php$ {  
  138.         #    root           html;  
  139.         #    fastcgi_pass   127.0.0.1:9000;  
  140.         #    fastcgi_index  index.php;  
  141.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
  142.         #    include        fastcgi_params;  
  143.         #}  
  144.    
  145.         # deny access to .htaccess files, if Apache's document root  
  146.         # concurs with nginx's one  
  147.         #  
  148.         #location ~ /.ht {  
  149.         #    deny  all;  
  150.         #}  
  151.     }  
  152.    
  153.    
  154.     # another virtual host using mix of IP-, name-, and port-based configuration      
  155.     server {  
  156.         #多监听         
  157.         listen       localhost:8666;  
  158.         #主机名  
  159.         server_name  LIULJ2576;  
  160.         #WEB文件路径  
  161.         root         E:/Portal;  
  162.         #默认首页  
  163.         index        HomePage.html;          
  164.         #location / {  
  165.         #    #这里相当于局部变量  
  166.         #    root   E:/Portal;  
  167.         #    index  HomePage.html;  
  168.         #}  
  169.     }  
  170.    
  171.    
  172.     # HTTPS server HTTPS SSL加密服务器  
  173.     #  
  174.     #server {  
  175.     #    listen       443;  
  176.     #    server_name  localhost;  
  177.    
  178.     #    ssl                  on;  
  179.     #    ssl_certificate      cert.pem;  
  180.     #    ssl_certificate_key  cert.key;  
  181.    
  182.     #    ssl_session_timeout  5m;  
  183.    
  184.     #    ssl_protocols  SSLv2 SSLv3 TLSv1;  
  185.     #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4 RSA: HIGH: MEDIUM: LOW: SSLv2: EXP;  
  186.     #    ssl_prefer_server_ciphers   on;  
  187.    
  188.     #    location / {  
  189.     #        root   html;  
  190.     #        index  index.html index.htm;  
  191.     #    }  
  192.     #}  
  193.    
  194. }  

CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'password';

 #号为注释内容,我们在cmd下运行nginx

授权

启动成功,出错的话,可以查询日志(日志路径是配置文件指定的,你可以修改存到其它位置)

GRANT privileges ON databasename.tablename TO 'username'@'host';

访问一下第二个server 配置的localhost:8666地址,结果出现

其中的privileges包括 select , delete , update 等权限,Django操作数据库需要全部的权限,可参考如下命令

 

GRANT ALL ON `discuz`.* TO 'discuz'@'localhost';

三、Nginx可以通过以下两种方式来实现与Tomcat的耦合:

查看用户权限:

将静态页面请求交给Nginx,动态请求交给后端Tomcat处理。

show grants for username@'localhost';

将所有请求都交给后端的Tomcat服务器处理,同时利用Nginx自身的负载均衡功能进行多台Tomcat服务器的负载均衡。

 

下面通过两个配置实例分别讲述这两种实现

 

一、动态页面和静态页面分离的实例

gunicorn 配置

gunicorn 可简单配置为

gunicorn –b 0.0.0.0:8999 dj.wsgi

执行命令之后,可以在浏览器访问页面,访问地址: 服务器IP(x.x.x.x):8999,但是看不到静态文件(图片,CSS,JS等)。静态文件的路径需要在nginx中配置。

参考连接 

 

这里假定Tomcat服务器的IP地址为192.168.12.130,同时Tomcat服务器开放的服务器端口为8080。Nginx相关配置代码如下:

nginx配置

Django文件的路径 最好是放在 /var/www/ 目录下,否则访问静态文件可能因为权限问题出现 403 forbidden error 错误,可以使用root账号来减小出现这种错误的可能。参考链接 

nginx配置文件的路径:

/etc/nginx/sites-available/ : 先把配置文件放在这里,编辑好之后,链接到目录 /etc/nginx/sites-enable/

简单的配置文件如下:

server 

{

    listen 80;

    location /static/ {

        alias /var/www/static/;  # 静态文件目录


    }

    location / {

        proxy_pass http://127.0.0.1:8999;

    }

}

不出意外应该是可以在浏览器端(访问地址: x.x.x.x)看到完整的页面了。另外要特别注意服务器开放的端口号有哪些。比如阿里云默认开放的端口号为 3389,需要自行设置一下,开放相应端口号,以免出现无法访问的问题。

 

Java代码  澳门新萄京官方网站 3

  1. server {   
  2.       listen 80;    
  3.       server_name www.ixdba.net;    
  4.       root /web/www/html;    
  5.     
  6. location /img/ {    
  7.       alias /web/www/html/img/;    
  8. }    
  9.     
  10. location ~ (.jsp)|(.do)$ {    
  11.      proxy_pass ;    
  12.      proxy_redirect off;    
  13.      proxy_set_header Host $host;    
  14.      proxy_set_header X-Real-IP $remote_addr;    
  15.      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
  16.      client_max_body_size 10m;    
  17.      client_body_buffer_size 128k;    
  18.      proxy_connect_timeout 90;    
  19.      proxy_send_timeout 90;    
  20.      proxy_read_timeout 90;    
  21.      proxy_buffer_size 4k;    
  22.      proxy_buffers 4 32k;    
  23.      proxy_busy_buffers_size 64k;    
  24.      proxy_temp_file_write_size 64k;    
  25. }    
  26.     
  27. }  

 在这个实例中,首先定义了一个虚拟主机www.ixdba.net,然后通过location指令将/web/www/html/img/目录下的静态文件交给Nginx来完成。最后一个location指令将所有以.jsp、.do结尾的文件都交给Tomcat服务器的8080端口来处理,即

需要特别注意的是,在location指令中使用正则表达式后,proxy_pass后面的代理路径不能含有地址链接,也就是不能写成

2、多个tomcat负载均衡的实例

这里假定有3台Tomcat服务器,分别开放不同的端口,地址如下:

?

1
2
3
192.168.12.131:8000 
192.168.12.132:8080 
192.168.12.133:8090

Nginx的相关配置代码如下:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
upstream mytomcats { 
      server 192.168.12.131:8000
      server 192.168.12.132:8080
      server 192.168.12.133:8090
  
server { 
      listen 80
      server_name www.ixdba.net; 
  
location ~* .(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { 
       root /web/www/html/; 
  
location / { 
          proxy_pass http://mytomcats; 
          proxy_redirect off; 
          proxy_set_header Host $host; 
          proxy_set_header X-Real-IP $remote_addr; 
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
          client_max_body_size 10m; 
          client_body_buffer_size 128k; 
          proxy_connect_timeout 90
          proxy_send_timeout 90
          proxy_read_timeout 90
          proxy_buffer_size 4k; 
          proxy_buffers 4 32k; 
          proxy_busy_buffers_size 64k; 
          proxy_temp_file_write_size 64k; 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ubuntu 下 nginx , php , mysql 和 golang 的简单安装

我是搞php出身,自然安装lnmp是常规技能。以前的手段还是lnmp安装包,比如军哥的lnmp1.0。随着php和mysql的更新,大多数一键安装都开始版本老化,更新困难的问题。因此,重新研究了一下Ubuntu下lnmp的安装,发现现在简单的多,记录一下。

另外最近在学习golang,Ubuntu下安装自然也是必须的过程。不过golang的安装也有一些奥妙。当然,不是源码安装的啦。

Nginx Stable/Development

Ubuntu下的包管理器是apt-get或者说dpkg。常规的安装命令apt-get install(注意权限sudo apt-get install)。Nginx是这几个软件里最友好的,直接可以添加stable源:

add-apt-repository ppa:nginx/stable

或者development源:

add-apt-repository ppa:nginx/development

如果没有安装命令add-apt-repository,安装:

apt-get install python-software-properties 

之后常规的操作:

apt-get update
apt-get install nginx
service nginx start

PHP 5.4

PHP的ppa源有个老兄专门在做,Ondrej Sury。有php5.4,php5.5和php5.6的源,具体的可以看官方页面。 为什么没有5.3?你落伍啦!5.4 性能提高很多,5.5还有内置的ZendOpCache。安装php5.5:

add-apt-repository ppa:ondrej/php5
apt-get update
apt-get install php5 php5-fpm
service php5-fpm start

还有些必要的包,安装一下,记得重启php5-fpm:

apt-get install php5-gd php5-curl php5-sqlite php5-mysqlnd php5-mcrypt
service php5-fpm restart

至于nginx怎么配置php-fpm,一搜一大把,不多说。

MySQL 5.5 & MariaDB

还是这个老兄,维护着mysql5.5, mysql5.6 和 MariaDB5.5。所以,很简单,比如安装MariaDB(不喜欢mysql,被oracle摧残了):

add-apt-repository ppa:ondrej/mariadb-5.5
apt-get update
apt-get install mariadb-server-5.5
service mysql start

这里注意,安装会提示InnoDB Plugin Disabled。不要紧,MariaDB把InnoDB内置进去了,其实是已经启动的。具体的可以:

mysql SHOW ENGINE INNODB STATUS;

Golang

重头戏是golang啦。我搜寻了半天ppa源,只找到一个可以安装golang1.1.1的源,很不爽。其实可以golang官方下载已经编译好的linux.tar.gz。但是需要自己手动设置GOROOT,有点麻烦啊。

终于还是发现了个好工具Godeb。实际上这就是一个deb包构建器。先把官方编译好的tar.gz下载,打包成deb然后执行安装。

以64位安装为例:

wget https://godeb.s3.amazonaws.com/godeb-amd64.tar.gz
tar -zxvf godeb-amd64.tar.gz
./godeb install

就开始安装最新版本。还可查看支持的版本,并安装特定版本:

./godeb list
1.2
1.2rc5
1.2rc4
1.2rc3
1.2rc2
1.2rc1
1.1.2
1.1.1
1.1
(...)

./godeb install 1.1

安装好后,可以用go env查看,是否安装完成。

剩下的设置GOPATH,GOBIN就不赘述了。我是修改在/etc/profile里面的。

写在最后

Ubuntu下很多东西都有源,容易安装,也是好事啊。

 

 

 

 

 

 

 

 

 

 

第一步,安装nginx

apt-get update
apt-get install nginx
即可完成安装

启动nginx:
/etc/init.d/nginx start
然后就可以访问了, , 一切正常!如果不能访问,先不要继续,看看是什么原因,解决之后再继续。

第二步,安装Php和mysql
安装php和MySQL:
apt-get install php5-cli php5-cgi mysql-server-5.0 php5-mysql

第三步,安装FastCgi和配置
我们需要/usr/bin/spawn-fcgi这个文件,而它是属于lighttpd这个包里面的,所以我们安装lighttpd然后把它设置为开机不启动:

apt-get install lighttpd #我们只要/usr/bin/spawn-fcgi
rcconf #去掉lighttpd开机自启动--------------------------------------------强烈推荐
修改nginx的配置文件:/etc/nginx/sites-available/default
修改 server_name 192.168.200.100;
修改index的一行修改为:
index index.php index.html index.htm;

去掉下面部分的注释并修改为:
location ~ .php$ {
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;
include /etc/nginx/fastcgi_params;

}

 

在server{}内定义日志文件的位置和相应的格式:
access_log /var/log/nginx/localhost_access.log combined;

 

access_log off;//表示关闭

 

重新启动nginx:
/etc/init.d/nginx stop
/etc/init.d/nginx start

启动fastcgi php:
spawn-fcgi -a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi

 
以下步骤我直接运行rcconf设置php-cgi为开机自启动即可,所以跳过
---------------------------------------为了让php-cgi开机自启动:
cd /etc/init.d
cp nginx php-cgi
vim php-cgi

替换nginx为php-cgi

并修改相应部分为:
DAEMON=/usr/bin/spawn-fcgi
DAEMON_OPTS="-a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi"
...
stop)
        echo -n "Stopping $DESC: "
        pkill -9 php-cgi
        echo "$NAME."


在/var/www/nginx-default/目录下创建一个文件:  /var/www/nginx-default/index.php
文件内容是:

< ?php phpinfo();?>

然后浏览器访问nginx就可以看到一切正常了

 

------------------------------------------------------------END 安装成功

 

配置文件目录 /etc/nginx/    nginx.conf     /sites-available/default

www目录 /var/www/nginx-default/

 

启动fastcgi php:
spawn-fcgi -a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi

 

 

日志文件:

localhost.access.log  /var/log/nginx/localhost.access.log

access.log  /var/log/nginx/access.log

error.log    /var/log/nginx/error.log

 

 

---------------重定向nginx错误页面的方法

error_page 404  /404.html;

这个404.html保证在nginx主目录下的html目录中即可,如果需要在出现404错误后直接跳转到另外一个地址,可以直接设置如下:

error_page 404  ;

同样的方式可以定义常见的403、500等错误。

特别注意的是404.html文件页面大小要超过512k,不然会被ie浏览器替换为ie默认的错误页面。

 

 

------------------------------虚拟主机配置

server {
    listen   80;
    server_name  localhost; 
    access_log  /var/log/nginx/localhost.access.log;

    location / {
        root   /var/www/nginx-default; 
        index index.php index.html index.htm;
    }

    location /doc {
        root   /usr/share;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

    location /images {
        root   /usr/share;
        autoindex on;
    }
    location ~ .php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }
}

server {
    listen   80;
    server_name  sdsssdf.localhost.com; 
    access_log  /var/log/nginx/localhost.access.log;

    location / {
        root   /var/www/nginx-default/console; 
        index index.php index.html index.htm;
    }

    location /doc {
        root   /usr/share;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

    location /images {
        root   /usr/share;
        autoindex on;
    }
    location ~ .php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }
}

 

----------------------监控  

 

location ~ ^/NginxStatus/ { 

stub_status on; #Nginx 状态监控配置     

 

 

 

这样通过 ) 监控到 Nginx 的运行信息:

 

Active connections: 1 
server accepts handled requests
 1 1 5 
Reading: 0 Writing: 1 Waiting: 0

 

 

NginxStatus 显示的内容意思如下:

  • active connections – 当前 Nginx 正处理的活动连接数。
  • server accepts handled requests -- 总共处理了 14553819 个连接 , 成功创建 14553819 次握手 ( 证明中间没有失败的 ), 总共处理了 19239266 个请求 ( 平均每次握手处理了 1.3 个数据请求 )。
  • reading -- nginx 读取到客户端的 Header 信息数。
  • writing -- nginx 返回给客户端的 Header 信息数。
  • waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

 

-------------------------------静态文件处理

通过正则表达式,我们可让 Nginx 识别出各种静态文件

 

location ~ .(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js|txt)$ {
        root /var/www/nginx-default/html;
        expires 24h;
        }

对于例如图片、静态 HTML 文件、js 脚本文件和 css 样式文件等,我们希望 Nginx 直接处理并返回给浏览器,这样可以大大的加快网页浏览时的速度。因此对于这类文件我们需要通过 root 指令来指定文件的存放路径,同时因为这类文件并不常修改,通过 expires 指令来控制其在浏览器的缓存,以减少不必要的请求。 expires 指令可以控制 HTTP 应答中的“ Expires ”和“ Cache-Control ”的头标(起到控制页面缓存的作用)。您可以使用例如以下的格式来书写 Expires:

 

 

expires 1 January, 1970, 00:00:01 GMT;
expires 60s;
expires 30m;
expires 24h;
expires 1d;
expires max;
expires off;

 

 

这样当你输入

 

例如 images 路径下的所有请求可以写为:

 

 

 

 

location ~ ^/images/ {
    root /opt/webapp/images;
}

 

 

 

 

------------------------动态页面请求处理[集群]

Nginx 本身并不支持现在流行的 JSP、ASP、PHP、PERL 等动态页面,但是它可以通过反向代理将请求发送到后端的服务器,例如 Tomcat、Apache、IIS 等来完成动态页面的请求处理。前面的配置示例中,我们首先定义了由 Nginx 直接处理的一些静态文件请求后,其他所有的请求通过 proxy_pass 指令传送给后端的服务器 (在上述例子中是 Tomcat)。最简单的 proxy_pass 用法如下:

 

location / {
    proxy_pass        ;
    proxy_set_header  X-Real-IP  $remote_addr;
}

 

 

这里我们没有使用到集群,而是将请求直接送到运行在 8080 端口的 Tomcat 服务上来完成类似 JSP 和 Servlet 的请求处理。

当页面的访问量非常大的时候,往往需要多个应用服务器来共同承担动态页面的执行操作,这时我们就需要使用集群的架构。 Nginx 通过 upstream 指令来定义一个服务器的集群,最前面那个完整的例子中我们定义了一个名为 tomcats 的集群,这个集群中包括了三台服务器共 6 个 Tomcat 服务。而 proxy_pass 指令的写法变成了:

 

 

 

# 集群中的所有后台服务器的配置信息
    upstream tomcats { 
     server 192.168.0.11:8080 weight=10; 
     server 192.168.0.11:8081 weight=10; 
     server 192.168.0.12:8080 weight=10; 
     server 192.168.0.12:8081 weight=10; 
     server 192.168.0.13:8080 weight=10; 
     server 192.168.0.13:8081 weight=10; 
    } 
    location / { 
        proxy_pass 反向代理
        include proxy.conf; 
        } 

 

 

----------------------压力测试

wget    
tar zxvf webbench-1.5.tar.gz   
cd webbench-1.5   
make && make install

#webbench -c 100 -t 10

参数说明:-c表示并发数,-t表示持续时间(秒)

 

 

root@ubuntu-desktop:/etc/nginx/sites-available# webbench -c 100 -t 10
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET
100 clients, running 10 sec.

Speed=19032 pages/min, 18074373 bytes/sec.
Requests: 3172 susceed, 0 failed.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

曾经配置过nginx比较高版本的安装方法及流程,这次也是在阿里云服务器ubuntu14.04.1版本安装nginx php mysql的方法及流程。

原文地址:

 

 

1、先更新ubuntu系统

更新命令

sudo apt-get update

sudo apt-get upgrade

2、更新和安装update and install

 

sudo apt-get update
sudo apt-get install nginx

3、启动nginx

 

sudo /etc/init.d/nginx start

4、check version(说明安装成功)

 

nginx -v 

5、配置php mysql

 

sudo apt-get install php5-cli php5-cgi mysql-server php5-mysql

6、安装FastCgi

 

sudo apt-get install spawn-fcgi

7、配置nginx

7.1、修改nginx的配置文件:/etc/nginx/sites-available/default 修改主机名

server_name localhost;

7.2、修改index的一行,添加index.php

index index.php index.html index.htm;

7.3、去掉下面部分的注释用于支持 php 脚本:

 

location ~ .php$ {
                fastcgi_split_path_info ^(. .php)(/. )$;
        #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        #
        #       # With php5-cgi alone:
                fastcgi_pass 127.0.0.1:9000;
        #       # With php5-fpm:
        #       fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        }

8、 重新启动nginx

 

sudo /etc/init.d/nginx restart
sudo /etc/init.d/nginx stop
sudo /etc/init.d/nginx start

 

9、启动fastcgi php

spawn-fcgi -a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi

10、nginx提示502 Bad Gateway错误

nginx 502 Bad Gateway错误之一:Fastcgi没有启动,启动命令是:

 

spawn-fcgi -a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi

 

11、设置php-cgi开机自启动

为了让php-cgi开机自启动:Ubuntu开机之后会执行/etc/rc.local文件中的脚本

所以我们可以直接在/etc/rc.local中添加启动脚本。

 

spawn-fcgi -a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi 

添加到语句:

 exit 0

前面才行

12、no input file specified错误

 

sudo vi /etc/nginx/sites-available/default

location ~ .php$ {
 root html;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php; 
fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;
 include fastcgi_params;
 }

 

location ~ .php$ {
                fastcgi_split_path_info ^(. .php)(/. )$;
        #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        #
        #       # With php5-cgi alone:
                fastcgi_pass 127.0.0.1:9000;
        #       # With php5-fpm:
        #       fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

注意

 

 

 

fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;

 

/var/www/nginx-default 改为你的网站根目录,一般就是改成这个。 server 字段下root 目录和网站根目录保持一致

 

 

 

 

 

 

 

 

 

 

 

 

Ubuntu下安装nginx

sudo apt-get install nginx

Ubuntu安装之后的文件结构大致为:

所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下

程序文件在/usr/sbin/nginx

日志放在了/var/log/nginx中

并已经在/etc/init.d/下创建了启动脚本nginx

默认的虚拟主机的目录设置在了/var/www/nginx-default

启动nginx

sudo /etc/init.d/nginx start

然后就可以访问了, , 一切正常!如果不能访问,先不要继续,看看是什么原因,解决之后再继续。

澳门新萄京官方网站 4

nginx默认页面

配置php和mysql

安装Php和mysql

安装php和MySQL:

sudo apt-get install php5-cli php5-cgi mysql-server php5-mysql

安装FastCgi

/usr/bin/spawn-fcgi这个文件来管理 FastCgi,它原属于lighttpd这个包里面,但 9.10 后,spawn-fcgi 被分离出来单独成包:

sudo apt-get install spawn-fcgi

配置 nginx

修改nginx的配置文件:/etc/nginx/sites-available/default 修改主机名:

server_name localhost;

修改index的一行修改为:

index index.php index.html index.htm;

去掉下面部分的注释用于支持 php 脚本:

location ~ .php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;

include /etc/nginx/fastcgi_params;

}

重新启动nginx:

/etc/init.d/nginx stop

/etc/init.d/nginx start

启动fastcgi php:

spawn-fcgi -a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi

为了让php-cgi开机自启动:

cd /etc/init.d

cp nginx php-cgi

vim php-cgi

替换nginx为php-cgi

并修改相应部分为:

DAEMON=/usr/bin/spawn-fcgi

DAEMON_OPTS="-a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi"

...

stop)

echo -n "Stopping $DESC: "

pkill -9 php-cgi

echo "$NAME."

然后运行rcconf设置php-cgi为开机自启动

创建、测试phpinfo:

sudo vi /var/www/nginx-default/info.php

打开 。

澳门新萄京官方网站 5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

环境:ubuntu 12.0.4 LTS

nginx(发音"engine x")是一个自由,开放源码,高性能的HTTP server。Nginx以稳定性,丰富的功能集,简单的配置,和低资源消耗而出名。本文将向你展示怎么在ubuntu 12.0.4 LTS 上安装Nginx,php5(及php-fpm),mysql。

 

 

一:安装前做个简单的说明

我使用的域名为example.com,ip地址是218.198.177.252。你可以视具体情况更改这些设置。在下文中我将使用root权限安装所需软件,所以请先切换到root用户:sudo su

 

 

二:安装MySQL

 

 

apt-get install mysql-server mysql-client

 

安装过程会提示你为MySQL root 用户提供一个密码----这个密码对 root@localhost可用,同时对root@example.com也可用,因此你需要手动为MySQL root用户指定一个密码:

New password for the MySQL "root" user: <-- yourrootsqlpassword

Repeat password for the MySQL "root" user: <-- yourrootsqlpassword

 

 

三:安装Nginx

 

apt-get install nginx

 

1,启动nginx

/etc/init.d/nginx start

 

2,打开浏览器输入 to nginx!,则说明安装成功,ubuntu 12.0.4 LTS上nginx默认的网站根目录在 /usr/share/nginx/www。

 

 

四:安装PHP5

PHP5可以在nginx上通过PHP-FPM(PHP—FPM(FastCGI Process Manager) 是一个可选的 FastCGI,添加了一些了一些很有用的特性,特别是对于繁忙的站点)工作。

说明:Nginx不支持对外部程序的直接调用或解析,所有的外部程序(包括PHP)必须通过FastCGI接口调用。

 

apt-get install php5-fpm

 

PHP-FPM是一个守护进程(init脚本文件在/etc/init.d/php5-fpm),它运行了一个FastCGI server,端口是 9000。

 

 

 

五:配置 nginx,以下是我本机的配置文件。

 

1,nginx的配置文件在/etc/nginx/nginx.conf, vim /etc/nginx/nginx.conf 如下:

 

 

user www-data;        //指定Nginx Worker 进程运行用户及用户组

worker_processes 4;      / /指定Nginx开启的进程数,每个Nginx进程平均耗费10M-20M内存。

pid /var/run/nginx.pid;    //用来指定进程id的存储文件的位置

 

events {                      //用来指定Nginx的工作模式,及连接上限数

           use epoll;       

           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;

        # server_tokens off;

 

        # server_names_hash_bucket_size 64;

        # server_name_in_redirect off;

 

        include /etc/nginx/mime.types;

        default_type application/octet-stream;

 

        ##

        # Logging Settings   //指定日志的存放路径

        ##

 

        access_log /var/log/nginx/access.log;

        error_log /var/log/nginx/error.log;

 

        ##

        # Gzip Settings         //开启Gzip 压缩

        ##

 

        gzip on;

        gzip_disable "msie6";

 

         gzip_vary on;

         gzip_proxied any;

         gzip_comp_level 6;

         gzip_buffers 16 8k;

         gzip_http_version 1.1;

         gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml rss text/javascript;

 

        ##

        # nginx-naxsi config

        ##

        # Uncomment it if you installed nginx-naxsi

        ##

 

        #include /etc/nginx/naxsi_core.rules;

 

        ##

        # nginx-passenger config

        ##

        # Uncomment it if you installed nginx-passenger

        ##

 

        #passenger_root /usr;

        #passenger_ruby /usr/bin/ruby;

 

        ##

        # Virtual Host Configs      //虚拟主机的配置

        ##

 

        include /etc/nginx/conf.d/*.conf;

        include /etc/nginx/sites-enabled/*;

 

 

}

#mail {

#       # See sample authentication script at:

#       #

#

#       # auth_http localhost/auth.php;

#       # pop3_capabilities "TOP" "USER";

#       # imap_capabilities "IMAP4rev1" "UIDPLUS";

#

#       server {

#               listen     localhost:110;

#               protocol   pop3;

#               proxy      on;

#       }

#

#       server {

#               listen     localhost:143;

#               protocol   imap;

#               proxy      on;

#       }

#}

 

2,虚拟主机被定义在server{}中,默认文件在/etc/nginx/sites-available/default,vim /etc/nginx/sites-available/default。

 

server {

        listen   80; ## listen for ipv4; this line is default and implied

        listen   [::]:80 default ipv6only=on; ## listen for ipv6

        root /usr/share/nginx/www;

        index index.php index.html index.htm;

        # Make site accessible from

        server_name _;

        location / {

                # First attempt to serve request as file, then

                # as directory, then fall back to index.html

                try_files $uri $uri/ /index.html;

        }

        location /doc {

                root /usr/share;

                autoindex on;

                allow 127.0.0.1;

                deny all;

        }

        location /images {

                root /usr/share;

                autoindex off;

        }

        #error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html

        #

        error_page 500 502 503 504 /50x.html;

        location = /50x.html {

                root /usr/share/nginx/www;

        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80

        #

        #location ~ .php$ {

        #       proxy_pass ;

        #}

        # pass the PHP scripts to FastCGI server


本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:Django服务器平台搭建,django不难陈设

关键词: