mac下安装nginx和php


Posted in PHP onNovember 04, 2013

一、前话:
1.1、环境选择:
重新在mac上配置php,原本mac上就自带有apach、php以及pgsql,如果图简单的话,直接用就可以了,不过在安装前我仔细思考了一下几个问题:
选apache还是nginx:两个我了解的都比较少,相对而言我接触nginx比较多,服务器用的也是nginx,没办法谁叫nginx负载高呢。为了更好的接触nginx的环境,我决定还是统一下环境,方便今后使用,这是这次的主要关键;
安装php:Mac os自带了php,好像是5.3.8,版本比较落后,不过这不碍事,因为以前我都是通过php-osx by Liip来管理php,所以不担心版本问题。不过php-osx by Liip好像没有fmp相关的配置,这样我我要和nginx一起用的话就相对比较麻烦了,那我只能选择其他方案了
安装mysql:这个就没有什么好疑问的了,目前我肯定不会去用pgsql,毕竟没接触过,需要有学习成本的,所以我在这篇纪录中把关于pgsql的部分都去掉了
1.2、那该如何安装:
既然我否定了系统自带的环境,那么就要通过别的方式去安装了,比如说手动编译。如果是手动编译的话,那么就会遇到下面几个问题:
编译费事,php依赖那么多程序,一个个安装,太累!
如果以后更新怎么办?灾难!!
不过好在mac下有自己的第三方管理程序:homebrew,而且相对而言我觉得他可能在某些方面更优越于linux下的apt-get、yum。如果通过homebrew来安装、管理运行环境的话,至少可以解决我几个问题:
安装问题,我不用繁琐的去安装依赖程序
升级问题,只需要brew update一次升级所有程序
版本问题,homebrew版本更新比较及时,而apt-get、yum来说,今年用的基本是几年前的稳定版本了
OK,下面的安装都是基于 homebrew,如果不熟悉或者还没安装有 homebrew 的话,可以查看这篇关于:Mac开发者利器-Homebrew介绍及安装。
二、安装nginx
2.1、安装:
用 brew 一键安装 nignx:
1
brew install nginx
如果需要安装其他 nginx 的版本,可以 “brew edit nginx” 打开修改 nginx 的安装信息包 formula,默认会用 vi 打开,在文件开头处修改 nginx 相应版本的下载地址就行。
2.2、配置
brew 执行完后,nginx 就安装好了。可以用以下指令对 nginx 进行操作:

#打开 nginx
sudo nginx
 

#重新加载|重启|停止|退出 nginx
nginx -s reload|reopen|stop|quit
打开 nginx 后,默认的访问端口 8080,如果要改为常用的 80 端口,则要修改 “/usr/local/etc/nginx/nginx.conf” 下监听(listen)端口值。
默认的文件访问目录(root)是 “/usr/local/Cellar/nginx/1.4.2/html”(这里的1.4.2是安装的nginx的版本,文件夹名以安装的nginx版本为准)。
2.3、把 nginx 设置为开机启动运行:
mkdir -p ~/Library/LaunchAgents/cp /usr/local/Cellar/nginx/1.4.2/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist

不过试了一下,不是超级用户登陆,而是普通用户登陆,并且监听的端口在1024以下的(例如把默认的8080端口改为了80端口),nginx 开机是启动不了。因此,要 nginx 开机启动的话,需要给予它管理员权限:
2
sudo chown root:wheel /usr/local/Cellar/nginx/1.4.2/bin/nginx
sudo chmod u+s /usr/local/Cellar/nginx/1.4.2/bin/nginx

三、安装mysql
3.1、安装:
brew install mysql

homebrew安装的版本同样是当前最新的稳定版,安装的过程比较简单,不过初始化就相对麻烦很多了,这里我失败了很多次。
3.2、配置:
3.2.1、初始化
初始安装 mysql 的一些配置数据库(例如:information_schema、mysql)
sudo mysql_install_db \
--verbose --user=`whoami` \
--basedir="$(brew --prefix mysql)" \
--datadir=/usr/local/var/mysql \
--tmpdir=/tmp \
--explicit_defaults_for_timestamp

这里我遇到了两个问题,过程都没纪录,这里简单提下解决方案:
系统建议我添加“?explicit_defaults_for_timestamp”;
安装过程中会遇到几个error,说是db的几个文件不存在;
网上搜索了下,大多是建议将/usr/local/var/mysql这个目录修改下权限;
我操作后发现可能不是这样的,造成这个问题在于我在之前操作遇到了错误中止了,生成了一个不完整var目录,所以每次安装失败我就删除以下文件,重新初始化就好了
sudo rm /usr/local/opt/mysql/my.cnf
sudo rm -R /usr/local/var/mysql/

待安装完毕后,会出现一大段mysql相关信息,运行下面的命令启动mysql
/usr/local/opt/mysql/bin/mysqld_safe &

执行完后,就可以在终端里运行 “mysql”,直接进入mysql数据库里。对,不用输入密码,可以直接连接,初始默认是可以匿名访问的。
3.2.2、修改密码
超级用户 “root” 也是没设密码,要设密码的话可以执行下面指令
/usr/local/opt/mysql/bin/mysqladmin -u root password 'new-password'

现在访问 mysql 还是不用密码就可以连接,如果要设置一些登陆密码的安全访问限制,则需执行下面的 mysql安全安装指令
/usr/local/opt/mysql/bin/mysql_secure_installation

主要是设置修改root密码(设置过了可以不用设置,略过)、删除匿名访问、删除root网络访问、删除test数据库。指令执行完后,登陆mysql就需要密码验证了
mysql -u root -p

3.3、开机启动mysql
mkdir -p ~/Library/LaunchAgents/cp /usr/local/Cellar/mysql/5.6.13/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

至此,mysql安装完毕。
四、安装php、php-fpm…
4.1、安装
Mac是预装了php,不过很多扩展都没安装,目测最多只能在终端里执行下php指令,所以我选择重新安装php。由于 brew 默认是没有 php 安装,所以要使用 “brew tap” 来安装 brew 的第三方程序包,这里使用 josegonzalez 的php安装包,具体操作如下:
brew tap homebrew/dupes
brew tap josegonzalez/homebrew-php

执行完后,就可以用 brew 安装php了。这里php有几个版本可以安装,具体可以执行 “brew search php” 查看一下有什么php版本可以安装,一般会有“php52、php53、php54、php55”版本,我安装的是最新的php5.5版本。由于PHP5.5版本已经内嵌了 FPM(FastCGI Process Manager),在安装选项里标明就行,本人 php 的安装配置指令如下:
sudo brew install php55 \
--with-debug \
--with-fpm \
--with-gmp \
--with-homebrew-openssl \
--with-imap --with-intl \
--with-libmysql \
--without-bz2 \
--without-mysql \
--without-pcntl \
--without-pear

更多的安装选项可以通过 “brew options php55″ 查看。
提示:?with-cgi不能和?with-fpm一起安装,互相冲突
指令执行完后,php 跟 php-fpm 就安装好了。
4.2、配置
由于是重装php,之前系统预装的php还没卸载,因此在终端调用php时,还是以之前系统的php版本做解析,所以这里需要修改path,指定 php 的解析路径。在~/.bashrc(没有则创建)最后加入一行:
export PATH="$(brew --prefix php54)/bin:$PATH"
[html]
[code]
source ./.profile

不存在这个文件的朋友请参照这片文章进行配置:Mac系统终端命令行不执行命令 总出现command not found解决方法
OK,php-fpm安装完成。
要修改配置 php 或者 php-fpm 的话,可以修改 “/usr/local/etc/php/5.5/php.ini” 、 “/usr/local/etc/php/5.5/php-fpm.conf”。
详细配置方法可以参照相关资料:
php-fpm 启动参数及重要配置详解
Linux平滑编译升级php至5.5.0
启动 php-fpm 的话就直接在终端里执行 “php-fpm”,默认打开 php-fpm 会显示一个状态 shell 出来,也可以把 php-fpm 的配置文件里的 “daemonize = no” 改为 “daemonize = yes”,就会以后台守护进程的方式启动,对于刚修改的配置文件,可以执行 “php-fpm -t” 来检测配置有没有问题。
4.3、开机启动
开机启动 php-fpm(下面的 5.5.3 是当前安装 php 的具体版本号):
mkdir -p ~/Library/LaunchAgents/cp /usr/local/Cellar/php54/5.5.3/homebrew-php.josegonzalez.php55.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php55.plist

为了方便,写了个启动、关闭、重启 php-fpm 的 shell 脚本:
#!/bin/shparam=$1
start()
{
    fpms=`ps aux | grep -i "php-fpm" | grep -v grep | awk '{print $2}'`
    if [ ! -n "$fpms" ]; then
        php-fpm
        echo "PHP-FPM Start"
    else
        echo "PHP-FPM Already Start"
    fi
}
stop()
{
    fpms=`ps aux | grep -i "php-fpm" | grep -v grep | awk '{print $2}'`
    echo $fpms | xargs kill -9
    for pid in $fpms; do
        if echo $pid | egrep -q '^[0-9]+$'; then
            echo "PHP-FPM Pid $pid Kill"
        else
            echo "$pid IS Not A PHP-FPM Pid"
        fi
    done
}
case $param in
    'start')
        start;;
    'stop')
        stop;;
    'restart')
        stop
        start;;
    *)
        echo "Usage: ./phpfpm.sh start|stop|restart";;
esac

五、设置 nginx 的 php-fpm 配置
在server块中添加解析文件类型“index index.html index.htm index.php;”
server {
        listen       80;
        server_name  localhost;
        index index.html index.htm index.php;
        ......
}

打开 nginx 默认注释掉的php location设置,修改如下(具体配置参数,例如路径,这里以我本地安装为准):
location ~ .*\.(php|php5)?$ {
        #fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  /Library/WebServer/public_html$fastcgi_script_name;
        include /usr/local/etc/nginx/fastcgi_params;
        #include fcgi.conf;
}

修改目录用户、用户组:
sudo chown www:www /Library/WebServer/public_html

OK,这样就可以在访问目录下(默认是/Library/WebServer/public_html)执行 php 文件了。嗯,赶快输出一下 “phpinfo()” 吧~
<?php
phpinfo();
PHP 相关文章推荐
PHP中实现汉字转区位码应用源码实例解析
Jun 14 PHP
PHP面向接口编程 耦合设计模式 简单范例
Mar 23 PHP
PHP基础陷阱题(变量赋值)
Sep 12 PHP
phpmyadmin打开很慢的解决方法
Apr 21 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
php编写的抽奖程序中奖概率算法
May 14 PHP
php把数组值转换成键的方法
Jul 13 PHP
使用phpstorm和xdebug实现远程调试的方法
Dec 29 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
Apr 15 PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 PHP
PHP实现单条sql执行多个数据的insert语句方法
Oct 11 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 #PHP
在PHP上显示JFreechart画的统计图方法
Nov 03 #PHP
php网站判断用户是否是手机访问的方法
Nov 01 #PHP
php合并js请求的例子
Nov 01 #PHP
php上传文件中文文件名乱码的解决方法
Nov 01 #PHP
PHP防止跨域提交表单
Nov 01 #PHP
PHP查询网站的PR值
Oct 30 #PHP
You might like
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
PHP 微信支付类 demo
2015/11/30 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
Gambit vs CL BO3 第二场 2.13
2021/03/10 DOTA
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
2016/08/02 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
vue元素实现动画过渡效果
2017/07/01 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
python2.7实现爬虫网页数据
2018/05/25 Python
python根据时间获取周数代码实例
2019/09/30 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
小学毕业感言150字
2014/02/05 职场文书
幼儿园元旦活动感言
2014/03/02 职场文书
银行行长竞聘演讲稿
2014/04/23 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
消防验收申请报告
2015/05/15 职场文书
全陪导游词开场白
2015/05/29 职场文书
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
Golang jwt身份认证
2022/04/20 Golang
SQL Server 中的事务介绍
2022/05/20 SQL Server