2015年1月

Nginx、MySQL 与 PHP 可以联合使用成为一个强大的动态内容服务器,这三者在不同的系统上面有不同的名称,本文所要讲解的是如何在 FreeBSD 上面搭建该环境,我们称之为 FEMP。我所使用的 FreeBSD 版本为 10.1。

第一步:安装这些软件

使用下面的命令即可完成软件的安装:

sudo pkg install nginx mysql56-server php56 php56-mysql

在安装完成之后,若您使用的是系统默认的 tcsh ,我们需要立即运行 rehash 命令。

若使用 CentOS 官方软件源的版本,直接使用下面的命令即可:

yum update
yum install postgresql postgresql-server 

但是,官方的源可能并不会提供最新版本的 postgresql 软件,所以,本文并不是使用 CentOS 官方的软件源安装,而是使用 postgresql 官方提供的 yum 源来安装最新版本的软件,在我写这篇文章时(也就是我服务器上安装的版本)为 postgresql 9.4

安装 postgresql

访问 PostgreSQL Repository 下载页面,根据自己服务器系统的版本选择添加适合自己的软件源。

对于 CentOS 6.x 32位 系统:

rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-6-i386/pgdg-centos94-9.4-1.noarch.rpm

对于 CentOS 6.x 64位 系统:

rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm

对于 CentOS 7 64位 系统

rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-1.noarch.rpm

使用下面的命令更新软件列表:

yum update

到现在为止,已经可以使用下面的命令安装 postgresql 了:

yum install postgresql94-server postgresql94-contrib

接着使用下面的命令初始化数据库:

CentOS 6.x 系统上:

service postgresql-9.4 initdb

CentOS 7.x 系统上:

/usr/pgsql-9.4/bin/postgresql94-setup initdb

接系统 postgresql 服务,并让其在每一次系统启动时,自动启动服务:

CentOS 6.x 系统上:

service postgresql-9.4 start
chkconfig postgresql-9.4 on

CentOS 7.x 系统上:

systemctl enable postgresql-9.4
systemctl start postgresql-9.4

调整 iptablesfirewall

调整 iptables 与 防火墙设置以让数据库服务器可以被远程系统访问。

CentOS 6.x 系统上:

vi /etc/sysconfig/iptables

添加下面这些行:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

保存,然后重启 iptables 服务:

service iptables restarton

CentOS 7.x 系统上:

firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

访问 PostgreSQL 命令提示符

默认的数据库名称与数据库用户名均为 postgres,通过 postgres 用户进行一些 postgresql 相关的操作:

su - postgres

要登录到 postgresql 服务器,输入下面这个命令:

psql

您会得到类似下面这样的提示符:

psql (9.4.0)
Type "help" for help.

postgres=#

输入 \q 退出 postgresql 命令提示符界面。

设置 postgres 用户的密码

通过下面命令登录到 postgresql 命令提示符:

su - postgres

psql

接着通过下面的命令设置 postgres 用户的密码:

postgres=# \password postgres 
Enter new password: 
Enter it again: 
postgres=# \q

要安装 PostgreSQL Adminpack,在 postgresql 命令提示符界面下输入下面命令:

postgres=# CREATE EXTENSION adminpack;
CREATE EXTENSION

创建新用户与数据库

作为示例,我们现在添加一个名为 eric 的用户,其密码为 password,然后再添加一个数据库,其名为 eric_db

su - postgres

创建用户 eric

$ createuser eric

创建 eric_db 数据库:

$ createdb --encoding=UTF8 eric_db

现在登录至 psql 命令行,设置密码,并授予 eric 访问 eric_db 的权限:

$ psql
psql (9.4.0)
Type "help" for help.

postgres=# alter user eric with encrypted password 'password';
ALTER ROLE

postgres=# grant all privileges on database eric_db to eric;
GRANT
postgres=#

删除用户与数据库

su - postgres

输入下面命令删除数据库:

$ dropdb <database-name>

输入下面命令删除用户:

$ dropuser <user-name>

配置 PostgreSQL-MD5 方式验证

MD5 验证 提供了一种以 Md5 方式加密密码的密码验证方式,要使用该功能,需要编辑 /var/lib/pgsql/9.4/data/pg_hba.conf 文件:

vi /var/lib/pgsql/9.4/data/pg_hba.conf

编辑或者修改下面这些行:

[...]
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.1.0/24          md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
[...]

使用下面的命令重启 postgresql 服务以更新配置文件:

CentOS 6.X 系统上:

service postgresql-9.4 restart

d CentOS 7 系统上:

systemctl restart postgresql-9.4

配置 PostgreSQL TCP/IP

默认的,TCP/IP 是关闭的,所以,若用户地人另外的服务器访问某台 postgresql 数据库服务器是不被允许的,若要启用该功能,您需要编辑 /var/lib/pgsql/9.4/data/postgresql.conf 文件:

vi /var/lib/pgsql/9.4/data/postgresql.conf

找到下面这些行:

[...]
#listen_addresses = 'localhost'
[...]
#port = 5432
[...]

取消注释,然后将 localhost 修改为您将允许的客户端IP地址,若要允许所有的客户端的联系,则使用 \* 即可:

listen_addresses = '*'
port = 5432

使用下面的命令重启 postgresql 服务以更新配置文件:

CentOS 6.X 系统上:

service postgresql-9.4 restart

d CentOS 7 系统上:

systemctl restart postgresql-9.4

第一步:添加 MongoDB 软件仓库的配置信息:

sudo touch /etc/yum.repos.d/mongodb.repo

vi /etc/yum.repos.d/mongodb.repo

若为64位系统,则使用以下配置:

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

若为32位系统,则使用下方配置:

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686/
gpgcheck=0
enabled=1

第二步:安装 MongoDB

sudo yum install mongo-10gen-server

第三步:配置 MongoDB

vi /etc/mongod.conf

内容如下:

# fork and run in background
fork = true

bind_ip = 127.0.0.1
port = 27017

运行 MongoDB

mongod --config /etc/mongod.conf

添加第三方软件源

PHP-FPM 在 CentOS 的官方程序库中不存在,所以我们首先得添加第三方扩展软件源。

rpm --import https://fedoraproject.org/static/0608B895.txt 
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

yum install yum-priorities

然后编辑:vi /etc/yum.repos.d/epel.repo

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://mirrors.aliyun.com/epel/6/$basearch
        http://mirrors.aliyuncs.com/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

接着:vi /etc/yum.repos.d/remi.repo

[remi]
name=Les RPM de remi pour Enterprise Linux 6 - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/6/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

安装 Nginx、MySQL以及PHP

#安装MySQL服务器
yum install mysql mysql-server

#安装Nginx
yum install nginx

#安装PHP及相关组件
yum install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy php-pecl-apc

待所有安装结束后,使用以下命令启动服务:

#启动MySQL
chkconfig --levels 235 mysqld on
service mysqld start

#启动Nginx
chkconfig --levels 235 nginx on
service nginx start

#启动PHP-FPM
chkconfig --levels 235 php-fpm on
service php-fpm start

若 Nginx 启动失败,则有可能是因为 Apache httpd 服务占用了该接口,这时,要么我们修改 Nginx 的坚挺端口,要么修改Apache httpd的或者直接删除 Apache httpd。

apachectl stop
yum remove httpd
chkconfig --level 235 httpd off

配置Nginx、MySQL与PHP-FPM

运行 mysql_secure_installation 命令,提升 MySQL 服务器的安全性,要求您要输入数据库 root 帐户密码,若您是新安装,则直接回车即可,接着立马设置新密码。

配置 PHP

打开 PHP 配置文件:vi /etc/php.ini

设置 cgi.fix_pathinfo=0

[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

设置 upload_max_filesize 最大文件上传尺寸为 upload_max_filesize16MB

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 16M

设置 post_max_size32MB

; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 32M

打开:vi /etc/php-fpm.d/www.conf

;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock;

以及:

listen.owner = www
listen.group = www
listen.mode = 0660

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = www
; RPM: Keep a group allowed to write in log dir.
group = www

不知道 Cordova 、Ionic、AngularJS 为何物的,请点击下方链接自行恶补:

需求

最后开始接触一些基于 Ionic + Cordova + AngularJS技术的移动App的开发,然后就遇到了很多都是需要有一个分享功能的,尤其是微信的分享,这也是第一次搞这种事情啊,没办法,折腾了好多天,解决了这个问题之后发现,原来是如此的简单。

准备好你的App

我在这里创建一个名为 WechatShareDemoApp 的新的App,在工作目录中运行如下命令:

ionic start WechatShareDemoApp tabs

这会使用 Ionic Tabs Seed 创建一个基于标签导航的空的App,创建成功之后,使用任何一个你喜欢的编辑器编辑该项目,我使用的是 WebStorm。

DashCtrl 增加一个 share(title,desc,url,thumb) 文法

share(title,desc,url,thumb) 方法用来打开一个 ActionSheet 面板,在该面板中,会提供两个分享按钮,一个用于分享内容至朋友圈,一个用于分享至会话,代码如下:

// 上面代码省略
.controller('DashCtrl', function($scope, $ionicActionSheet) {
    $scope.share = function(title, desc, url, thumb) {
        $ionicActionSheet.show({
            buttons: [
                { text: '<b>分享至微信朋友圈</b>' },
                { text: '分享给微信好友' }
            ],
            titleText: '分享',
            cancelText: '取消',
            cancel: function() {
                // 取消时执行
            },
            buttonClicked: function(index) {
                if(index == 0) {
                    $scope.shareViaWechat(WeChat.Scene.timeline, title, desc, url, thumb);
                }
                if(index ==1 ) {
                    $scope.shareViaWechat(WeChat.Scene.session, title, desc, url, thumb);
                }
            }
        });
    };
})
// 下面代码省略

share(title,desc,url,thumb) 的运行方式是,点击该方法被调用时,打开一个 ActionSheet ,点击 分享至微信朋友圈 按钮被点击时,执行 $scope.shareViaWechat(WeChat.Scene.timeline, title, desc, url, thumb),点击 分享给微信好友 时,执行 $scope.shareViaWechat(WeChat.Scene.session, title, desc, url, thumb),前者分享内容至朋友圈,后者分享内容至会话,但是,$scope.shareViaWechat 方法本身是不存在的,所以,我们还需要添加该方法。

DashCtrl 添加 $scope.shareViaWechat 方法

该方法使用了第三方的 Cordova 插件提供的方法 WeChat.share,该方法可以将内容分享至微信中,代码如下:

// 前面代码省略
.controller('DashCtrl', function($scope, $ionicActionSheet, $ionicPopup) {

    //......        

    $scope.shareViaWechat = function(scene, title, desc, url, thumb) {
        // 创建消息体
        var msg = {
            title: title ? title : "行者无疆",
            description: desc ? desc : "A real traveller's province is boundless.",
            url: url ? url : "https://pub.ofcrab.com",
            thumb: thumb ? thumb : null
        };

        WeChat.share(msg, scene, function() {
            $ionicPopup.alert({
                title: '分享成功',
                template: '感谢您的支持!',
                okText: '关闭'
            });
        }, function(res) {
            $ionicPopup.alert({
                title: '分享失败',
                template: '错误原因:' + res + '。',
                okText: '我知道了'
            });
        });
    };
})
// 后面代码省略

在上面的代码中, WeChat 是由第三方插件提供的,至现在为止,分享功能已经做完,我们现在需要在 views 中添加分享功能的激活按钮。

添加分享按钮

打开 templates/tab-dash.html,在 ion-content 结束前,添加如下代码:

<button class="button button-assertive button-outline button-block" ng-click="share()">分享</button>

该按钮会打开分享的 ActionSheet,我们不需要传任何参数,因为在上面的分享方法中,对没有设定的参数已经提供了默认的内容了。

此时,应用的界面如下图所示:

微信分享 ActionSheet.jpg

添加微信分享插件

虽然样子已经成型了,但是还是不能进行分享的,我们需要安装一个插件,该插件使用到了微信官方的第三方开发库,需要先在微信开放平台申请一个AppId,然后还需要使用 Gen_Signature_Android221cbf.zip 插件从手机中根据包名获取一个 Signature Code,该代码还必须填写进入开放平台中,在该过程中,若我们的App是运行在Android平台的话,还涉及到 keystore 的问题,这里不做过多的阐述,若我们的项目为新项目的话,还需要先生成一个Android安装包(必须生成 Apk 包之后安装),安装至某一个手机中,然后在该手机中使用上面的 Gen_Signature_Android221cbf 应用获取 Signature 值,再填入开放平台的相应设置中。

您在申请了AppID之后,还需要了解到你需要将你的包名也设置进入开放平台中,该包名在 Ionic 项目中的, config.xml 文件中可以进行设置。

该插件必须在 Platform 添加之后安装,所以我们先添加一个 Platform,比如 Android

ionic platform add android

在 App 的根目录下使用下面的命令即可:

cordova plugin add com.wordsbaking.cordova.wechat --variable APP_ID=[你的APPID]

上面的 APP_ID 为你在微信开放平台申请的 App ID,安装该插件时,必须添加至命令中。

打包并安装使用

将新生成的项目专稿 Eclipse 中,打包并安装测试。

一直都是用的 Ionic Framework做一些小的应用,但是最近发现,在所有的小米手机,甚至所有的 Miui 下面, Ionic Framework 的 Tabs 布局都有问题。

Screenshot_2015-01-08-04-04-22.png
Screenshot_2015-01-08-04-06-32.png

\Phalcon\Text 是 Phalcon 框架提供的字符处理工具类,该类中定义了如下这些工具方法:

public static function camelize($str){ }
public static function uncamelize($str){ }
public static function increment($str, $separator=null){ }
public static function random($type, $length=null){ }
public static function startsWith($str, $start, $ignoreCase=null){ }
public static function endsWith($str, $end, $ignoreCase=null){ }
public static function lower($str){ }
public static function upper($str){ }

camelize($str)

该方法用于将字符串转换为驼峰式字符串,原始字符串要求以下划线 _ 相连,使用示例如下:

echo \Phalcon\Text::camelize('coco_bongo'); //CocoBongo

uncamelize($str)

该方法将驼峰式的字符串转换为以下划线相连的字符串,使用示例如下:

echo \Phalcon\Text::uncamelize('CocoBongo'); //coco_bongo

increment($str, $separator=null)

给字符串后面增加一个数字后缀,同时对该后缀进行递增操作,若原始字符串还未被设置过,则在字符串后面增加之,若已定义过,则给该数字加1,使用示例如下:

echo \Phalcon\Text::increment("a"); // "a_1"
echo \Phalcon\Text::increment("a_1"); // "a_2"
echo \Phalcon\Text::increment("a","-); // "a-1"

第二个参数用于定义数字与字符串的分隔符。

random($type, $length=null)

根据给定的类型生成相应类型的随机字符串,类型是以 RANDOM_ 为前缀的常量, Phalcon提供了如下几个随机类型常量:

const RANDOM_ALNUM = 0; // 包含英文字母与数字的随机字符串
const RANDOM_ALPHA = 1; // 仅包含英文字母的随机字符串
const RANDOM_HEXDEC = 2; // 
const RANDOM_NUMERIC = 3; // 纯数字随机字符串
const RANDOM_NOZERO = 4; // 无0的随机纯数字字符串

第二个参数用于定义生成的随机字符串的长度。

startsWith($str, $start, $ignoreCase=null)

检测 $str 字符串是否以 $start 字符串开始,$ignoreCase 定义是否忽略大小写,使用示例如下:

echo \Phalcon\Text::startsWith("Hello", "he", false); // true
echo \Phalcon\Text::startsWith("Hello", "he"); // false
echo \Phalcon\Text::startsWith("Hello", "He"); // true

endsWith($str, $end, $ignoreCase=null)

startsWith 使用方法一致,其功能为检测是否以 $end 字符串结尾,使用示例如下:

echo \Phalcon\Text::endsWith("Hello", "LLO", false); // true
echo \Phalcon\Text::endsWith("Hello", "LLO"); // false
echo \Phalcon\Text::endsWith("Hello", "llo"); // true

lower($str)

$str 字符串转换为纯小写,若 mbstring 函数可用,lower 函数会优先选择 mbstring 函数。

upper($str)

$str 字符串转换为纯大写,功能与 lower 函数类似。

最近越来越发现自己变懒了,没有以前那么强的追根问底的勇气了,最近这几个月腾讯云一直在做活动,三折起,我买了两台服务器,配置也还不错,最高的配置的那一台现在是做为公司的备用服务器在使用,而还有一个配置稍低一些的,则做自己的个人使用了,对于个人这一台,我最开始是安装的SUSE作为服务器操作系统,然后,发现软件版本的各种老啊,如果是以前的话,可能我会通宵达旦地把这软件给升级咯,可是现在却选择了一个更简单的方法,把SUSE换成了CentOS,然后同样的问题出现了,然后,我又回到了Ubuntu的怀抱。

从各种网站上面是各种搜索,只是为了想知道,到底CentOS、Suse与Ubuntu哪一个发行版做服务器更好,最后的结果是没有人能告诉我一个确切的答案,公说公有理,婆说婆有理,索性,咱回到业务的出发点,不就是为了要一台服务器么,只要能实现我的需求,那就行,然后在各种比较之后,我还是选择了最易用的Ubuntu 12.04 LTS,然后,再一次开始这个环境的安装与配置。

安装 Nginx、MySQL、PHP

如果想运行最新版本的Nginx(版本一般会高于Ubuntu官方的),需要先运行下面两行命令:

aptitude install python-software-properties
add-apt-repository ppa:nginx/stable

直接运行下面整段命令即可完成所有必须软件的安装,对于PHP,我还安装了一些功能库:

apt-get update
apt-get upgrade
apt-get install nginx mysql-client mysql-server memcached php5-common php5-dev php5-cgi php5-fpm php-apc php5-mysql php5-pgsql php5-sqlite php5-curl php5-gd php5-intl php-pear php5-mcrypt php5-memcache php5-ming php5-recode php5-tidy php5-xmlrpc php5-xsl php5-mcrypt php5-imap
注意:安装过程中,需要输入 MySQL 服务器 root 用户的密码。

安装完成之后,各服务就会自动启动了,直接访问服务器的IP即可访问,各配置文件分别保存在:

  • /etc/php5/fpm/php.ini
  • /etc/nginx/

这些目录下。

建议

  1. 将PHP-FPM 默认监听的 127.0.0.1:9000 改成了 /var/run/php5-fpm.sock,改了之后,需要把 nginx.conf 添加以下代码片段:

    upstream php {

      server unix:/var/run/php5-fpm.sock;

    }

  2. 我的 nginx 虚拟机路径都被设置为 /home/www/PRIMARY_DOMAIN_NAME/public ,需要把 PRIMARY_DOMAIN_NAME 修改成为虚拟主机主域名。