码迷,mamicode.com
首页 > 其他好文 > 详细

阿里云应用纪实

时间:2014-06-18 07:34:34      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   http   tar   

首先表述一个观点,之所以用阿里云,是被迫无奈,因为google的GAE被天朝贵国河蟹了,在墙内无法访问。原计划在墙外面购买其它空间,但是考虑到天朝贵国不定什么时候抽风,就任意把墙外的网络河蟹了,造成访问不稳定。所以,不得不下一个艰难的决定,启用墙内的服务器空间。

墙内有很多家,选那家呢?没怎么比较就直接选择阿里云了,没有为什么,就冲着我的一个好朋友曾经跟马云一起做过中国黄页。

由于是第一次用,将这个过程记录下啦,一方面有纪念意义(常常第一次是有纪念意义的,比如第一...,你懂得。);另外,也是为其他朋友做一个参考,当然,也是为自己做一个经验总结。

购买空间

没什么说的,按照自己的需要,在阿里云上定好产品,然后付款。用支付宝哦。

这里要补充一下,如果网站域名是在万网申请的话,最好用万网的注册用户名申请阿里云,免得左一个用户名、右一个。太多了,有时候自己搞糊涂了。

为什么要在万网申请域名?

说实在的,万网的域名比墙外的贵,我不愿意在这里申请。但是,还是由于天朝贵国毫无规律地抽风,最担心的是不知道在墙外面申请的域名是否允许备案,所以被逼迫着在墙里面申请域名。

万网域名申请,要上传身份证照片。

备案

这是一个天朝归国特别色的环节。

在阿里云代理备案的网站注册,跟阿里云的用户不是同一个。

然后严格按照上面的要求填写各种资料和上传资料。经过好多步骤。

不过,阿里云在服务上做的很好,如果备案有搞不定的地方,毫不客气地在微博上找 @阿里云客户满意中心 的妹子问,她不仅在网上回复,还很热情地打过来电话,用银铃般的声音耐心的告诉你应该怎么做,哪怕是你发牢骚,她还是那么耐心细致。

当然,备案要有耐心,因为需要时间审核。

原来我对备案有恐惧感,经过客服妹子的帮助,明白了流程,虽然复杂,但是阿里给了支持,还是可以完成的。

经历了自己上传资料、到指定地点拍照之后,又将所有资料邮寄给阿里云。还在等待各种审批,已经2天过去了。

连接阿里云

空间申请下来之后,就可以连接阿里云。这个不用等备案。

连接方法一:我的电脑是ubuntu操作系统,所以,我用这种方式连接阿里云:通过ssh连接远程服务器

连接方法二:在阿里云的帮助有好多种连接方法,从我的使用体验来看,还是推荐用Xshell+Xftp,终端要是windows操作系统。具体看这个连接:http://help.aliyun.com/manual?helpId=129

对磁盘分区挂载

刚买到的阿里云空间,还不能立刻使用,必须经过分区和挂载操作之后,才能使用。

没有什么难点,按照这里说的一步一步做,就能大功告成。

http://help.aliyun.com/manual?spm=0.0.0.0.A08yCp&&helpId=271

mysql配置

特别说明:一下记录内容,是我在不同时候配置数据库时遇到的不同问题,不代表着一定这么做,只是经验罢了。并且,从我的经验来看,如果是自己开发程序并发布,最好不要用一键安装的数据库(注意,我说的是不用数据库,但是一键安装的服务器还是不错滴),因为在一键安装的时候,经常会丢点东西,还是老老实实用:sudo apt-get install mysql-server来安装最好了,以后缺少什么再进行安装,而且由于是用默认设置,也方便与网上提供的解决方案结合。

在阿里云的帮助文档中有“linux一键安装web环境全攻略”,根据这里的方法,能够快捷地安装nginx服务器以及php、 mysql.

 我按照帮助中的步骤进行了安装,当然能够安装成功了。但是,很多时候“但是”是必须的。但是当我远程链接mysql数据库,妄图通过这个命令来操作数据库的时候

 #mysql -u root -p
然后提示我输入密码。因为在安装的过程中并没有提示我输入密码,按照经验,应该是空。当我敲击回车键之后,出现了以下提示:

ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password:NO)

根据以往的经验判断,这是由于权限问题,虽然当前帐号是root,但是在上述命令中,此帐号是请求在 localhost中的权限,现在是用远程链接,不在localhost中。所以,权限不足,不能操作数据库。

有一种方法是改变权限。这里备注一下,一般用下面的方法修改权限。(以下两种方法来源于网络。)

方法一:

# /etc/init.d/mysql stop

# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &

# mysql -u root mysql

mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';

mysql> FLUSH PRIVILEGES;

mysql> quit

# /etc/init.d/mysql restart

# mysql -uroot -p

Enter password: <输入新设的密码newpassword>

mysql> 

我是第二次按照这个方法做了一遍,成功了。

方法二:

直接使用/etc/mysql/debian.cnf文件中[client]节提供的用户名和密码:

# mysql -udebian-sys-maint -p

Enter password: <输入[client]节的密码>

mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';

mysql> FLUSH PRIVILEGES;

mysql> quit# mysql -uroot -p

Enter password: <输入新设的密码newpassword>

mysql> 

我采用方法一,但是,当运行mysqld_safe时,提示我这个东西没有安装,我试图按照安装,不成功。第二种方法没有尝试。

这时候就产生了不走上述简单一键安装的流程了,还是喜欢自己一个一个安装。一个原因是习惯这么搞了,虽然麻烦,但是从感觉踏实(强迫症表现)。于是不管上面已经通过一键安装的结果了。从新安装mysql,比较简单。在shell中敲入下面的命令

# apt-get install mysql-server

然后就安装了,其中出现让我熟悉的输入mysql的root账户的密码的界面,密码要搞得密一些,别做成123456,因为这是将要对外开放的网络数据库了。我设置的密码是......(此处省略200字)

就这样,mysql配置好了。其实很简单,如果不按照一键式安装折腾的话。

后记:本着不断折腾的精神,我一直耿耿于按照阿里云里面的方法為什麼不成功,于是,我还是做出了一个艰难的决定,在折腾一遍。于是,删除自己刚刚安装的数据库,从新回到阿里云里面的方法,进行安装。之后又出现了前面的那个提示,然后按照方法一操作。居然这次提示成功了。

其实,还不知道原因。

mysql.sock问题

为了测试阿里云的配置效果,上传了phpwind,通过域名来安装,出现了以下错误提示:

Can‘t connect to local MySQL server through socket

这个错误的编号是2002。

网上搜了一下,这种错误普遍存在。其原因是:

是mysql.sock 文件不存在或者位置不正确,有可能不小心删除了,比如卸载软件的时候,也有一种情况,是存在的位置不对。或许在/var/lib/mysql里面呢。

这个东西是做什么用的呢?先科普:

连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果套接字文件不存在了,本地客户就不能连接。

解决方法有多种,网上也列出了很多。但是,不存在一种万能的方法,因为每个人的服务器环境有差别。所以,要多种方法尝试一下,哪个能用就用哪个。

方法一:通过重启服务器重新创建mysql.sock。因为服务器在启动时重新创建它。(这种方法简单,但是有时候不能管用。看运气了。)

方法二:编辑/etc/mysql/my.cnf文件: 有一段是[client]开头的,修改里面的 socket = /tmp/mysqld/mysql.sock(或者是mysqld.sock) 改为 socket = /tmp/mysql.sock;还有一段[mysqld]开头的也改这一项。简单点,就是将里面的socket=......的语句注释了,用socket=/tmp/mysql/mysql.sock。特别注意:改完了之后重启mysql服务。

如果你运气欠佳,或许在这种方法的时候还遇到困难,可以参考:http://kong1616.iteye.com/blog/682342

方法三:这种方法适用于在系统中有mysql,是因为程序设置问题。检查一下 MySQL 的 socket 路径,然后打开 config.inc.php(php程序系统的配置) 找到$dbhost = ‘localhost‘; 在 localhost 后面加冒号‘:’和 MySQL 的 socket  路径。比如 MySQL 服务器为 localhostMySQL 的 socket  路径为 /tmp/MySQL.sock那么就改成如下:$dbhost = ‘localhost:/temp/MySQL.sock‘;

方法四:如果系统有mysql,只是位置不对,可以指定mysql通道 

[root@localhost ~]# mysql --socket=/var/lib/mysql/mysql.sock

Welcome to the MySQL monitor.  Commands end with ; or /g.

Your MySQL connection id is 2 to server version: 5.0.22Type ‘help;‘ or ‘/h‘ for help. Type ‘/c‘ to clear the buffer.

PYTHON配置

阿里云的ubuntu服务器中,自带了python2.7.3,很好。我最喜欢这个了。

接下来安装了easy_install。

# apt-get install python-setuptools python-dev build-essential

然后安装了web.py

sudo easy_install web.py

也可以在后续安装flup的时候同时安装web.py.

我图省事,采用了阿里云提供的一键安装,已经装好了mysql,为了能够让我的python程序和mysql联合工作,必须要安装mysqldb,到下面链接下载:

http://sourceforge.net/projects/mysql-python/

有时候天朝贵国的网络抽分,可能无法下载,就爬过去下载吧。

下载之后,做如下操作:

(1)在shell中,进入到下载文件所在目录,解压缩(我下载的压缩文件名称MySQL-python-1.2.4b4.tar.gz):

tar xvzf  MySQL-python-1.2.4b4.tar.gz

(2)解压缩之后,文件都放在了名称为MySQL-python-1.2.4b4的文件夹中,在当前目录,进入该目录。

cd MySQL-python-1.2.4b4

(3)编辑目录中的 site.cfg文件,目的是将系统中已经安装的mysql路径在这里标记上。

vim  site.cfg
把 mysql_config = /usr/local/mysql/bin/mysql_config 这一行前的#(注释)去掉,并且把mysql_config的路径写上。我用的是阿里云的一键安装,其mysql_config路径是: /alidata/server/mysql/bin/mysql_config

(4)运行下面的两个指令安装
    python setup.py build
    sudo python setup.py install

如此安装了mysqldb,但是这时候还没有完全搞好。我在安装mysql的时候并没有将mysql加入到动态库中。所以,还要做如下操作。

首先要特别提醒,如果不做如下操作,会出现的情况是:

>>>import MySQLdb
......报错,libmysqlclient_r.so.16 没找到。
ImportError: libmysqlclient_r.so.16: cannot open shared object file: No such file or directory
.....
好了,就不得不这么操作了。现在你也许大概明白了python的麻烦了,虽然开发效率高,功能强,但是部署起来还是比较麻烦的。没有十全十美的东西。
# updatedb
# locate libmysqlclient_r.so.16(说明:这个命令是要找到mysql中的libmysqlclient_r.so.16的位置)

我的阿里云出现的是:

/alidata/server/mysql-5.1.57/lib/mysql/libmysqlclient_r.so.16
/alidata/server/mysql-5.1.57/lib/mysql/libmysqlclient_r.so.16.0.0

然后编辑/etc/ld.so.conf文件。

#vim  /etc/ld.so.conf

将/alidata/server/mysql-5.1.57/lib/mysql/libmysqlclient_r.so.16写到文件里面,这就是所谓的加入动态库文件的路径。

再执行:

# ldconfig  -v

就这样,大功告成了。

补充:
动态链接库的管理命令 ldconfig 说明:
1、ldconfig命令的用途:主要是在默认搜寻目录(/lib 和 /usr/lib)以及动态库配置文件 /etc/ld.so.conf 内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),
进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。
2、ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。

Nginx服务域名配置

方法见这里:http://help.aliyun.com/manual?spm=0.0.0.0.EwRcmg&helpId=532
顶级域名的配置方法视频课程讲解清晰.归纳一下:
1 在/alidata/server/nginx/conf/vhosts中,将.conf文件复制一份.特别注意,一般顶级域名的中间名字为这个文件名字。
2、修改该文件内的信息,主要是将localhost/default之类的东西修改为自己域名的名字,中间那个。
3、建立对应的文件夹,还是和域名一致
4、修改文件夹权限:chown -R www:www 文件夹名字   说明:www:www是用阿里云提供的一键安装设置的。

在nginx服务配置上,特别推荐使用阿里云的一键安装程序,方法是:

(1)将阿里云提供的一键安装 sh文件夹放到服务器上,并且给予足够权限chmod –R 777 sh

(2)cd sh,察看文件里面的文件,有一个名字为install_nginx-1.0.4.sh的。运行这个文件,就按照阿里云一键安装中的设置来安装和配置服务器了。运行方法:sh install_nginx-1.0.4.sh

自我感觉,阿里云提供的这种服务器配置比较整齐,特别是conf的设置简单明了,容易记忆。比单独用apt-get install安装更容易找到和维护。


除了在nginx上做好域名配置之外,更大量的工作还在conf配置上。下面的例子是在对下列要求的配置:

ubuntu+nginx+python+web.py的配置。

1、flup是上述环境的依赖,官方网站:http://trac.saddi.com/flup,如果用:sudo apt-get install python-flup,在线安装flup的同时会将web.py也安装上。

2、安装spawn-fcgi: sudo apt-get install spawn-fcgi

3、参考web.py官方文档:http://webpy.org/cookbook/fastcgi-nginx  进行配置。因为我使用的是阿里云官方推荐的一键安装,所有的东西都在/alidata/server/nginx/conf/vhosts/*.conf里面呢。所以,将下面的内容配置到相应的.conf文件中即可。

location / {
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        fastcgi_param GATEWAY_INTERFACE CGI/1.1;
        fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
        fastcgi_param REMOTE_ADDR $remote_addr;
        fastcgi_param REMOTE_PORT $remote_port;
        fastcgi_param SERVER_ADDR $server_addr;
        fastcgi_param SERVER_PORT $server_port;
        fastcgi_param SERVER_NAME $server_name;
        fastcgi_param SERVER_PROTOCOL $server_protocol;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9002;(端口号可以修改)
}
 location /static/ {
        root /path/to/www;(修改为自己的程序文件存储目录,比如:/alidata/www/abc;
        if (-f $request_filename) {
           rewrite ^/static/(.*)$  /static/$1 break;
        }
    }

.conf配置好之后,保存。

4、执行下列命令:

spawn-fcgi -d /path/to/www -f /path/to/www/index.py -a 127.0.0.1 -p 9002

注意:路径应该修改为自己的程序文件路径,端口号要和前面设置的一样。

5、分别编写两个脚本文件,存储在/path/to/www里面,当然,位置不重要,重要的是这两个脚本文件让你以后启动和关闭简单一些。不嫌麻烦,也可以不写。但是必须启动这个。

第一个,命名为start.sh

#!/bin/sh
spawn-fcgi -d /path/to/www -f /path/to/www/index.py -a 127.0.0.1 -p 9002

注意:路径和端口要修改为自己的,设置同前面。

第二个,命名为shutdown.sh

#!/bin/sh
kill `pgrep -f "python /path/to/www/index.py"`

6、举例说明,写一个index.py文件,放在自己的目录中。样子如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import web

urls = ("/.*", "hello")
app = web.application(urls, globals())

class hello:
    def GET(self):
        return ‘Hello, world!‘

if __name__ == "__main__":
    web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)    #这个是必须的,不能少
    app.run()

7、进入到程序目录中,执行:sudo chmod +x index.py。如果忘记执行这个,会出现:problem spawn-fcgi child exited with 126错误。

然后,运行前面制作的start.sh脚本

8、重启nginx。

/alidata/server/nginx/sbin/nginx -s reload

剩下的事情就是运行网站了。

如果是php,这里可以参考:https://www.akii.org/ubuntu-9-10-install-nginx-fastcgi-spawn-fcgi-mysql-diary.html

以上都做好之后,我抽了一下风,将机器重启(不是服务器重启),之后执行: spawn-fcgi -d /alidata/www/szcraft -f /alidata/www/szcraft/index.py -a 127.0.0.1 -p 9002,出现提示:spawn-fcgi: child exited with: 127

对这个错误折腾了很长时间,还是不成。最后在阿里云上提交共单。但是没有看到阿里提供的解决方案。早晨祷告之后,又做了如下操作:

删除原有程序;将程序重新上传。之后按照上面的流程操作。于是成功了。為什麼?还是不知其所以然。

问题

1、出现(1045, "Access denied for user ‘root‘@‘localhost‘ (using password: YES)")错误。

我在运行程序的时候,这种错误屡次出现。解决方案是:

(1)检查数据库权限,也就是在shell中执行mysql -u root -p,输入密码后,是否能够进入数据库,如果不能,就要对数据库设置进行修改。网上似乎很多人遇到,但是解决方案就三种,且还不一定都管用。我使用体会是,想方法修改数据库密码。网上方法也都是这个核心。推荐这种方案:

# /etc/init.d/mysql stop
# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
# mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD(‘newpassword‘) where USER=‘root‘;
mysql> FLUSH PRIVILEGES;
mysql> quit

# /etc/init.d/mysql restart
# mysql -uroot -p
Enter password: <输入新设的密码newpassword>

(2)检查程序代码。特别是读写数据库的程序。这个很重要,有时候本地开发环境和服务器部署环境还是有很大差异的。

2、出现服务器405错误

这个问题的解决方案中,网上有一种方法是修改location的配置,但是我不推荐这种方法,推荐修改nginx源码。方法如下:

源码文件位于 /nginx源码目录/src/http/modules/ngx_http_static_module.c ,找到如下代码:

if (r->method & NGX_HTTP_POST) {
     return NGX_HTTP_NOT_ALLOWED;
}

如果是用阿里云的一键安装,这个文件在sh/nginx-1.0.4里面去找。

将上述代码注释掉之后,将服务器从新编译。注意,不是安装,是编译。下面的方法适合于阿里云一键安装。(如果不是这个,可以用make命令来编译)(说明:以下方法是中电云集的技术人员吴直提供)

进入服务器后删除/alidata/server/nginx  /alidata/server/nginx-1.0.4 

然后删除nginx 进程  命令 :killall nginx 
这个时候我们可以重新编译nginx 了

进入一键安装包 sh 目录  修改 install_nginx-1.0.4.sh  
内容:

#! /bin/sh
wget http://soft.phpwind.me/top/nginx-1.0.12.tar.gz
mv nginx-1.0.12.tar.gz nginx-1.0.4.tar.gz
tar zxvf nginx-1.0.4.tar.gz
mv nginx-1.0.12 nginx-1.0.4
cd nginx-1.0.4
./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module
make
make install
chmod 775 /alidata/server/nginx/logs
chown -R www:www /alidata/server/nginx/logs
chmod -R 775 /alidata/www
chown -R www:www /alidata/www
cd ..
cp -fR ./config-nginx-1.0.4/* /alidata/server/nginx/conf/
chmod 755 /alidata/server/nginx/sbin/nginx
/alidata/server/nginx/sbin/nginx

################


其中 “./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module

是编译nginx的模块,要什么模块就在这个后面加  --with-xxxxxxx    不要什么模块 就是--with-out-xxxxx

修改保存后  sh  install_nginx-1.0.4.sh

这样就可以重新编译nginx ,也可以修改nginx.conf  在里面添加和修改配置文件。

阿里云应用纪实,布布扣,bubuko.com

阿里云应用纪实

标签:style   class   blog   code   http   tar   

原文地址:http://blog.csdn.net/qiwsir/article/details/31791017

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!