centos搭建git过程

确认服务器是否安装Git

1
rpm -qa git

首先需要安装Git,可以使用yum源在线安装

1
yum install -y git

创建用户junhey-git

1
2
useradd junhey-git
passwd junhey-git

生成ssh公钥

1
2
3
4
5
6
7
su junhey-git
cd ~
mkdir .ssh
ssh-keygen -t rsa
cd .ssh/
cat id_rsa.pub >> ~/.ssh/authorized_keys
exit

添加junhey-git到sudoers文件

junhey-git用户现在对一些文件夹没有操作权限,修改/etc/sudoers文件来改变他的权限。最高管理员用户用下面命令打开。

1
visudo

然后我们在vim中找到下面这行
root ALL=(ALL) ALL
按i键开始插入,回车一下在下面一行加上
junhey-git ALL=(ALL) ALL
接着按下esc键,输入 :wq ,回车保存退出

创建Git代码仓库

1
2
3
4
5
mkdir gitrepo
cd gitrepo
mkdir test.git
chown -R junhey-git:junhey-git gitrepo/
git init --bare test.git

git clone ssh://username@username.webfactional.com:/home/username/webapps/git_app/repos/dev.git

本地拉取代码/克隆仓库

1
2
3
4
5
mkdir test
git init
git remote add origin junhey-git@139.129.130.226:/gitrepo/test.git
//或者
git clone junhey-git@139.129.130.226:/gitrepo/test.git

javascript 函数

函数创建方式

  • 声明
1
2
3
function consoleTip (){
console.log("tip!");
}
  • 表达式
1
2
3
var consoleTip = function(){
console.log("tip!");
}
  • 两种方式异同
  1. 表达式方式适合用来定义只使用一次的函数,声明方式定义的函数没有这个限制,当然也不是绝对的,这个区别只适用于编码规范上;

  2. 声明方式定义的函数可以在函数调用之前定义也可以在函数调用之后定义,而表达式方式定义的函数只能在函数调用之前定义;

函数参数

函数参数包括形参,实参,形参就是函数定义时的参数;实参就是函数调用时传入的参数。由于js是弱类型语言,所以js函数的形参不指定类型。

js函数的形参和实参个数可以不一致。形参个数小于实参时,未传的形参值都是undefined,注意形参可以指定默认值,但是只能在函数体内部指定;形参个数小于实参时,在函数体内引用多余实参,必须通过实参对象arguments来获取实参,在函数体内部arguments就是实参对象的引用,并且此时的实参对象是一个数组对象,数组对象每一项对应着函数调用时传入的参数。

PS:实参对象有两个特殊属性callee和caller,其中callee属性代指当前正在执行的函数,caller属性代指调用当前正在执行的函数的函数,caller属性不是标准属性,不是所有浏览器都支持。使用callee属性的典型例子就是匿名函数的递归调用。例如定义一个阶乘函数:

1
2
3
4
5
6
7
var fact = function(x){
if(x <= 1) {
return 1;
}else{
return arguments.callee(x-1)*x;
}
};

函数作用域

在函数中声明的变量(包括函数形参)在整个函数体内都是可见的,包括嵌套的函数中,在函数外部是不可见的;函数体内部定义的变量会覆盖同名的全局变量;

函数作用域中有个特性很重要,就是声明提前,意思就是在函数内部任意位置声明的变量,在函数体内部任意位置都是可见的,这是因为js引擎在预编译js时会把函数中所有的变量声明都提前至函数体顶部。例如:

1
2
3
4
5
6
7
var scope = "outter";
function(){
console.log(scope); //undefined
var scope = "inner";
console.log(scope); //inner
}();
console.log(scope); //outter

说明:
  undefined 由于函数作用域的声明提前特性,这里的scope已经在函数顶部声明,但是没有被赋值,所以scope值为undefined
  inner scope在函数体内部声明,并且有赋值
  outter  函数体内部定义的变量会覆盖同名的全局变量,但是不影响全局变量的值

构造函数

构造函数的用处就是用来初始化新创建的对象,例子:`var ary = new Array();

构造函数与普通函数的区别:
 1.函数命名上有区别,构造函数命名时通常是首字符大写,普通函数命名时首字符小写;
 2.调用方式的区别,构造函数是通过new关键字调用,而普通函数直接调用。

立即执行函数

把函数定义和函数执行结合到一起就是立即执行函数,也叫自执行函数。

这里需要注意两点:

  1. 函数定义仅限于表达式方式定义的函数;
  2. 函数执行实际上就是对函数表达式做一次运算,所以一元运算符都可以让函数执行。

这样的话,立即执行函数就会有多种写法:

1
2
3
4
5
6
(function(){console.log("IIFE");}());
(function(){console.log("IIFE");})();
!function(){console.log("IIFE");}();
void function(){console.log("IIFE");}();
~function(){console.log("IIFE");}();
//....

立即执行函数可以接受参数,上面的写法都是可以的,但是编码规范推荐第一种写法,jQuery库使用的就是第一种写法。

那么自执行函数的用处有哪些呢?总结起来常用也就两种:

  1. 保存参数上下文环境;
  2. 作为命名空间。

用处1的适用场景:循环中执行异步函数,并且函数参数随循环变化。

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
/**
* 实例一
* 错误写法,因为jQuery的post方法是异步的,循环十次,post方法并行跑十次,
* 循环比post方法执行要快,最终传过去的i值都变成了10,即服务端收到index的都是10
*/
for(var i=0; i<10; i++){
$.post(url,{index:i},function(){});
}
/**
* 正确写法,这样对于循环体中的立即执行函数来说,每次循环得到的参数都不同。立即执行函数
* 每执行一次都会创建一个函数上下文环境,在这个上下文环境中的变量值不受外界影响,
* 循环十次就会创建十个上下文环境,并且每个上下文环境的i值都不一样。这样的话,
* 虽然post方法是异步方法,但是是在每一个上下文环境中执行的,也就是说循环十次,
* post方法在十个上下文环境中分别执行了一次,post方法中使用的index参数每次都不一样,
* 最终服务端收到的index值就是从0到9十个数值
*/
for(var i=0; i<10; i++){
(function(index){$.post(url,{index:index},function(){});}(i));
}
/**
* 实例二
* 错误写法,最终会输出十个10,因为循环体的语句会延时执行
*/
for(var i=0; i<10; i++){
setTimeout(function(){console.log(i);},100);
}
//正确写法,最终会输出0到9十个数值,原理同上
for(var i=0; i<10; i++){
(function(x){setTimeout(function(){console.log(x);},100);}(i));
}

用处2的适用场景:你需要写一个公共模块,这个公共模块在很多地方都会使用,但是要保证公共模块中使用的变量和函数不会对其它模块造成污染,这样的话这个公共模块就需要一个单独的不同于其它模块的命名空间。

案例1:创建jQuery插件,保证创建的jQuery插件在jQuery的命名空间内都是有效的,这样每个jQuery对象才可以使用。

1
2
3
4
5
6
(function($){
$.fn.changeStyle = function(colorStr){
this.css("color",colorStr);
return this;
}
}(jQuery));

jQuery插件开发

案例2:创建一个带有私有变量和私有方法的对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var obj = (function(){
var privateAttr,
publicAttr;
function _setPriAttr(){
privateAttr = "private";
}
function getPriAttr(){
return privateAttr;
}
return {
attr:publicAttr,
getAttr:function(){
getPriAttr();
}
}
}());

通过这种方式创建的对象,利用立即执行函数的return语句对外暴露属性以及方法,并且可以保证没有对外暴露对象的属性和方法,在对象外边是无法访问到的。

总结:其实用处1和用处2的原理都是一样的,都是利用了函数作用域的概念,请仔细体会。

参考资料: js权威指南

phantomjs安装在centos和入门教程

官方网站

http://phantomjs.org/

下载与安装

安装步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#安装依赖软件
yum -y install wget fontconfig
#下载安装包
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
#解压安装包
tar xjf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/
#重命名
mv /usr/local/phantomjs-2.1.1-linux-x86_64 /usr/local/phantomjs
#添加环境变量/建立软链接
export PHANTOMJS_HOME=/usr/local/phantomjs/bin
ln -s /usr/local/phantomjs/bin/phantomjs /usr/bin/
#测试
phantomjs --version

入门

官方文档

PhantomJS教程

阿里云centos搭建nginx和node全过程

centos版本:CentOS release 6.8 (Final)

  1. ssh登录
    1
    ssh root@139.129.130.226

然后输入密码

  1. yum更新

    1
    yum -y update
  2. 编译源代码的开发工具

    1
    yum -y groupinstall "Development Tools"

安装node.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#进入/usr/src文件夹,这个文件夹通常用来存放软件源代码
cd /usr/src
#从Node.js的站点中获取压缩档源代码, 我选择的版本为v0.10.18
wget http://nodejs.org/dist/v0.10.18/node-v0.10.18.tar.gz
#解压缩源文件,并且进入到压缩后的文件夹中
tar zxf node-v0.10.18.tar.gz
cd node-v0.10.18
#执行配置脚本来进行编译预处理
./configure
make&make install
#测试安装Node.js的模块管理器npm
npm -g install express
#建立超级链接, 不然 sudo node 时会报 "command not found"
sudo ln -s /usr/local/bin/node /usr/bin/node
sudo ln -s /usr/local/lib/node /usr/lib/node
sudo ln -s /usr/local/bin/npm /usr/bin/npm

安装 Nginx

1
2
3
4
5
6
7
8
9
#安装一些额外的软件仓库
sudo yum install epel-release -y
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
#包管理工具安装nginx
sudo yum install nginx -y
#启动
service nginx start

通过公网ip (本地可以通过 localhost /或 127.0.0.1 ) 查看nginx 服务返回的信息:
Welcome to nginx!

其中启动过程报错:

1
2
Starting nginx: nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
[FAILED]

解决办法:

1
vim /etc/nginx/conf.d/default.conf


1
2
listen 80 default_server;
listen [::]:80 default_server;

改为:

1
2
listen 80;
#listen [::]:80 default_server;

重新启动nginx即可 试过kill nginx 进程,修改关闭ipv6都不管用

安装mongodb

安装说明:

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
#进入文件夹/usr/local,下载mongodb源代码
cd /usr/local
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz
#解压安装包,重命名文件夹为mongodb
tar zxvf mongodb-linux-x86_64-2.4.9.tgz
mv mongodb-linux-x86_64-2.4.9 mongodb
#在var文件夹里建立mongodb文件夹,并分别建立文件夹data用于存放数据,logs用于存放日志
mkdir /var/mongodb
mkdir /var/mongodb/data
mkdir /var/mongodb/logs
#打开rc.local文件,添加CentOS开机启动项
vim /etc/rc.d/rc.local
#将mongodb启动命令追加到本文件中,让mongodb开机自启动
/usr/local/mongodb/bin/mongod --dbpath=/var/mongodb/data --logpath /var/mongodb/logs/log.log -fork
#启动mongodb
/usr/local/mongodb/bin/mongod --dbpath=/var/mongodb/data --logpath /var/mongodb/logs/log.log -fork
#看到如下信息说明已经安装完成并成功启动
forked process: 18394
all output going to: /var/mongodb/logs/log.log

JavaScript中的立即执行函数

注:此文只在理解立即执行函数,不在所谓原创,文中大量引用阮一峰的JavaScript标准参考教程MDN的JavaScript 参考文档深入理解JavaScript系列(4):立即调用的函数表达式的内容。

描述
立即执行函数通常有下面两种写法:

1
2
3
4
5
6
7
(function(){
...
})();
(function(){
...
}());

在Javascript中,一对圆括号“()”是一种运算符,跟在函数名之后,表示调用该函数。比如,print()就表示调用print函数。
这个写法和我们想象的写法不一样(知道的人当然已经习以为常)很多人刚开始理解立即执行函数的时候,觉得应该是这样的:

1
2
3
4
5
function (){ ... }();
//或者
function fName(){ ... }();

然而事实却是这样:SyntaxError: Unexpected token (。这是为什么呢?

解释
要理解立即执行函数,需要先理解一些函数的基本概念:函数声明、函数表达式,因为我们定义一个函数通常都是通过这两种方式

函数声明 (function 语句)

1
2
3
function name([param[, param[, ... param]]]) {
statements
}

name:函数名;
param:被传入函数的参数的名称,一个函数最多可以有255个参数;
statements:这些语句组成了函数的函数体。

函数表达式 (function expression)

函数表达式和函数声明非常类似,它们甚至有相同的语法。

1
2
3
function [name]([param] [, param] [..., param]) {
statements
}

name:函数名,可以省略,省略函数名的话,该函数就成为了匿名函数;
param:被传入函数的参数的名称,一个函数最多可以有255个参数;
statements:这些语句组成了函数的函数体。

下面我们给出一些栗子说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 声明函数f1
function f1() {
console.log("f1");
}
// 通过()来调用此函数
f1();
//一个匿名函数的函数表达式,被赋值给变量f2:
var f2 = function() {
console.log("f2");
}
//通过()来调用此函数
f2();
//一个命名为f3的函数的函数表达式(这里的函数名可以随意命名,可以不必和变量f3重名),被赋值给变量f3:
var f3 = function f3() {
console.log("f2");
}
//通过()来调用此函数
f3();

上面所起的作用都差不多,但还是有一些差别
1、函数名和函数的变量存在着差别。函数名不能被改变,但函数的变量却能够被再分配。函数名只能在函数体内使用。倘若在函数体外使用函数名将会导致错误:

1
2
var y = function x() {};
alert(x); // throws an erro

2、函数声明定义的函数可以在它被声明之前使用

1
2
3
4
foo(); // alerts FOO!
function foo() {
alert('FOO!');
}

但函数声明非常容易(经常是意外地)转换为函数表达式。当它不再是一个函数声明:

成为表达式的一部分
不再是函数或者script自身的“源元素” (source element)。在script或者函数体内“源元素”并非是内嵌的语句(statement)

1
2
3
4
5
6
7
8
9
10
11
12
13
var x = 0; // source element
if (x == 0) { // source element
x = 10; // 非source element
function boo() {} // 非 source element
}
function foo() { // source element
var y = 20; // source element
function bar() {} // source element
while (y == 10) { // source element
function blah() {} // 非 source element
y++; //非source element
}
}

Examples:

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
// 函数声明
function foo() {}
// 函数表达式
(function bar() {})
// 函数表达式
x = function hello() {}
if (x) {
// 函数表达式
function world() {}
}
// 函数声明
function a() {
// 函数声明
function b() {}
if (0) {
//函数表达式
function c() {}
}
}

现在我们来解释上面的SyntaxError: Unexpected token (:
产生这个错误的原因是,Javascript引擎看到function关键字之后,认为后面跟的是函数定义语句,不应该以圆括号结尾。
解决方法就是让引擎知道,圆括号前面的部分不是函数定义语句,而是一个表达式,可以对此进行运算。所以应该这样写:

1
2
3
4
5
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();

这两种写法都是以圆括号开头,引擎就会认为后面跟的是一个表示式,而不是函数定义,所以就避免了错误。这就叫做“立即调用的函数表达式”(Immediately-Invoked Function Expression),简称IIFE。

注意,上面的两种写法的结尾,都必须加上分号。
推而广之,任何让解释器以表达式来处理函数定义的方法,都能产生同样的效果,比如下面三种写法。

1
2
3
4
5
var i = function(){ return 10; }();
true && function(){ /* code */ }();
0, function(){ /* code */ }();

甚至像这样写:

1
2
3
4
5
6
7
!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

new关键字也能达到这个效果:

1
2
3
new function(){ /* code */ }
new function(){ /* code */ }() // 只有传递参数时,才需要最后那个圆括号。

使用
那我们通常为什么使用函数立即表达式呢,以及我如何使用呢?

通常情况下,只对匿名函数使用这种“立即执行的函数表达式”。它的目的有两个:

一是不必为函数命名,避免了污染全局变量;
二是IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。

1
2
3
4
5
6
7
8
9
10
11
// 写法一
var tmp = newData;
processData(tmp);
storeData(tmp);
// 写法二
(function (){
var tmp = newData;
processData(tmp);
storeData(tmp);
}());

上面代码中,写法二比写法一更好,因为完全避免了污染全局变量。

最后在举一个真实的栗子:在JavaScript的OOP中,我们可以通过IIFE来实现一个单例(关于单例的优化不再此处讨论)

// 创建一个立即调用的匿名函数表达式
// return一个变量,其中这个变量里包含你要暴露的东西
// 返回的这个变量将赋值给counter,而不是外面声明的function自身

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
var counter = (function () {
var i = 0;
return {
get: function () {
return i;
},
set: function (val) {
i = val;
},
increment: function () {
return ++i;
}
};
} ());
// counter是一个带有多个属性的对象,上面的代码对于属性的体现其实是方法
counter.get(); // 0
counter.set(3);
counter.increment(); // 4
counter.increment(); // 5
counter.i; // undefined 因为i不是返回对象的属性
i; // 引用错误: i 没有定义(因为i只存在于闭包)

原文地址:https://segmentfault.com/a/1190000003902899
文章转载,如有冒犯请联系。

rem布局

rem

rem(font size of the root element)是指相对于根元素的字体大小的单位

rem布局主要有两种形式

  • css媒体查询 设置好font-size

  • js动态计算font-size

viewport设置

1
<meta name="viewport" content="initial-scale=1,maximum-scale=1, minimum-scale=1">

rem 初始化

copy from taobao

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
33
<script>
!function (win) {
function refreshRem() {
var width = docEl.getBoundingClientRect().width;
width / dpr > 540 && (width = 540 * dpr), win.rem = width / 16, docEl.style.fontSize = win.rem + "px"
}
var dpr, scale, tid, doc = win.document, docEl = doc.documentElement, metaEl = doc.querySelector('meta[name="viewport"]'), flexibleEl = doc.querySelector('meta[name="flexible"]');
if (metaEl) {
var match = metaEl.getAttribute("content").match(/initial\-scale=(["']?)([\d\.]+)\1?/);
match && (scale = parseFloat(match[2]), dpr = parseInt(1 / scale))
} else if (flexibleEl) {
var match2 = flexibleEl.getAttribute("content").match(/initial\-dpr=(["']?)([\d\.]+)\1?/);
match2 && (dpr = parseFloat(match2[2]), scale = parseFloat((1 / dpr).toFixed(2)))
}
if (!dpr && !scale) {
var k = (win.navigator.appVersion.match(/android/gi), win.navigator.appVersion.match(/iphone/gi)), devicePixelRatio = win.devicePixelRatio;
dpr = k ? devicePixelRatio >= 3 ? 3 : devicePixelRatio >= 2 ? 2 : 1 : 1, scale = 1 / dpr
}
if (docEl.setAttribute("data-dpr", dpr), !metaEl)if (metaEl = doc.createElement("meta"), metaEl.setAttribute("name", "viewport"), metaEl.setAttribute("content", "initial-scale=" + scale + ", maximum-scale=" + scale + ", minimum-scale=" + scale + ", user-scalable=no"), docEl.firstElementChild) {
docEl.firstElementChild.appendChild(metaEl);
}else {
var l = doc.createElement("div");
l.appendChild(metaEl), doc.write(l.innerHTML)
}
win.dpr = dpr, win.addEventListener("resize", function () {
clearTimeout(tid), tid = setTimeout(refreshRem, 300)
}, !1), win.addEventListener("pageshow", function (e) {
e.persisted && (clearTimeout(tid), tid = setTimeout(refreshRem, 300))
}, !1), "complete" === doc.readyState ? doc.body.style.fontSize = 12 * dpr + "px" : doc.addEventListener("DOMContentLoaded", function () {
doc.body.style.fontSize = 12 * dpr + "px"
}, !1), refreshRem()
}(window);
</script>

mac上用的比较多的快捷键(常更新)

Mac OS X 菜单中的修饰键符号

Command 键图标(Command 键) - 在某些 Apple 键盘上,此键也可能带有 Apple 标志(apple 标志)
Control 键图标(Control 键)
Option 或 Alt 键图标(Option 键)-“Alt”可能也出现在此键上
Shift 键图标(Shift 键)
Caps lock 键图标(Caps Lock 键)- 切换大写字母锁定开或关
fn(功能键)

mac快捷键.png

control+command+f 全屏的快捷键

command+option+i 开发者模式

Command+W 关分页

Command+R 刷新

Command+T 新开分页

shift+Command+3全屏和+4局部 截屏键

finder =>command + option + 拖拽到桌面上 桌面快捷方式

command +f3 回到桌面切换(非全屏模式下)

command+control+f 程序全屏切换

command+tab 程序切换

cmd+c→cmd+v 复制粘贴

cmd+c→cmd+option+v 剪切粘贴

command+q 完全退出程序

Mac下安装nginx

Mac安装nginx

安装brew(由于MAC自带ruby,所以安装起来很方便)

1
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装后命令存在 /usr/local/bin/brew

brew安装nginx

1
brew install nginx (或者 /usr/local/bin/brew install nginx)

过后等着就行了。会自动安装pcre和ssl等。

Mac上Nginx配置

背景

之前一直使用Apache做静态资源私服及反向代理, 配置稍显复杂, 今天使用nginx来替换Apache, 在此小记一下探索的过程及碰到的问题.

安装

本人使用Mac系统, 偷懒的使用了homebrew, 一键完成了安装. 对于其它OS使用解压zip的方式.

下面从安装–>配置(静态资源私服 php 反向代理)–>问题展开吧

安装Homebrew

ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

brew cleanup

brew doctor
安装Nginx

安装

brew install nginx
启动

sudo nginx
停止

sudo nginx -s stop
配置

文件目录

nginx安装文件目录

/usr/local/Cellar/nginx
nginx配置文件目录

/usr/local/etc/nginx
系统hosts位置

/private/etc/hosts
配置nginx

使用多个配置来管理nginx下的多个websites

cd /usr/local/etc/nginx

mkdir conf.d

vim /usr/local/etc/nginx/nginx.conf
在nginx.conf中进行修改, 大致配置可如下, 详细配置见官方文档

user your_username staff;
worker_processes 1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include conf.d/*.conf;
}
注意修改该配置中的your_username为你的Mac用户名.

到此父级配置已配置完成, 接下来配置用户希望的功能, 例如静态资源私服或反向代理.

配置自己的静态资源服务器(username.conf), 如下

server {
listen 80;
server_name resource.com;
charset utf-8,gbk;
location / {
root /Users/username/resource;

    #index  index.html index.htm;
    autoindex on;
    autoindex_exact_size on;
    autoindex_localtime on;
}

}
配置反向代理, 如下

server {
listen 80;
server_name app.com;

# oauth2的资源服务器
location / {
    proxy_set_header        Host $http_host;
    proxy_pass http://localhost:8080/resource-app/;
}

location /resource-app/ {
    proxy_set_header        Host $http_host;
    proxy_pass http://localhost:8080/resource-app/;
}

# oauth2的授权服务器    
location /actor-app/ {
    proxy_set_header        Host $http_host;
    proxy_pass http://localhost:8082/actor-app/;
}

}
配置Php

安装php-fpm

Mac OSX 10.9的系统自带了PHP、php-fpm,省去了安装php-fpm的麻烦。 这里需要简单地修改下php-fpm的配置,否则运行php-fpm会报错。

sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf
vim /private/etc/php-fpm.conf
修改php-fpm.conf文件中的error_log项,默认该项被注释掉,这里需要去注释并且修改为error_log = /usr/local/var/log/php-fpm.log。如果不修改该值,运行php-fpm的时候会提示log文件输出路径不存在的错误。

配置hosts

vim /private/etc/hosts
在末尾加入如下代码, 该域名是nginx中server指定的server_name

针对静态资源私服

127.0.0.1 resource.com

针对反向代理

127.0.0.1 app.com
配置完毕, 在浏览器中键入http://resource.com/可以对指定目录的文件进行浏览,下载; 键入http://app.com/resource-app或http://app.com/actor-app可分别进入不同的应用.

测试

在root根目录中创建文件index.php, 内容如下,

<?php phpinfo(); ?>
启动nginx

sudo nginx
重启nginx

sudo nginx -s reload
停止nginx

sudo nginx -s stop
启动php

sudo php-fpm
在浏览器中输入http://resource.com/index.php即可看到php的详细信息.

问题

1.键入http://resource.com/, 服务器返回403界面

该问题是因为访问权限不够造成, 在nginx.conf首行配置即可,

user your_username staff;

2.目录未显示, 只显示index.html页面

该问题是指定站点(website)未启用目录浏览功能, 在指定server的location节点启用目录浏览功能,如下,

autoindex on;
autoindex_exact_size
autoindex_localtime on;

来自:http://arccode.net/2015/02/27/Nginx%E9%85%8D%E7%BD%AE%E5%B0%8F%E8%AE%B0/

//前面要添加的代码 //后面要添加的