Nginx+PHP安装部署

这里记录安装部署Nginx+PHP相关的一些东西。

环境+依赖

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
# 基本编译环境
yum -y install gcc automake autoconf libtool make gcc-c++ glibc
# PHP依赖
yum -y install libmcrypt-devel mhash-devel libxslt-devel libjpeg \
libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 \
libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel \
bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs \
e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel
# 安装pcre:
cd /usr/local/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xx.xx.tar.gz
tar -zxvf pcre-xx.xx.tar.gz
cd pcre-xx.xx
./configure
make
make install
# 安装zlib:
cd /usr/local/src
wget http://zlib.net/zlib-x.x.x.tar.gz
tar -zxvf zlib-x.x.x.tar.gz
cd zlib-x.x.x
./configure
make
make install
# 安装ssl:
cd /usr/local/src
wget http://www.openssl.org/source/openssl-x.x.x.tar.gz
tar -zxvf openssl-x.x.x.tar.gz

安装PHP

安装

这里可能遇到各种缺少依赖的错误,遇到什么就安装什么就行,可以参考文章“20+ common PHP compilation errors and fix”。这里的配置项比较多,也很难对每一项都非常了解,所以其实可以设置少一些选项,然后等真的需要的时候再重新编译。这其实非常容易,重新安装一遍后重启php-fpm就可以了

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
34
35
36
37
38
39
40
wget http://cn2.php.net/distributions/php-xx.xx.xx.tar.gz
tar zvxf php-xx.xx.xx.tar.gz
cd php-xx.xx.xx.tar.gz
./configure
--prefix=/usr/local/php \
--enable-fpm \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--with-mcrypt \
--enable-mbstring \
--disable-pdo \
--with-curl \
--disable-debug \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--enable-pcntl \
--enable-mbregex \
--with-mhash \
--enable-zip \
--with-pcre-regex \
--with-mysql \
--with-mysqli \
--with-gd \
--with-jpeg-dir \
--with-openssl \
--enable-pdo \
--with-pdo-mysql \
--with-mysql-sock=/var/lib/mysql/mysql.sock \
--with-config-file-path=/usr/local/php/etc

make all install
# 把php.ini放到指定的位置
cp php.ini-development(根据需要换成其它) /usr/local/php/etc/php.ini
# 配置php.ini中的timezone参数为Asia/Shanghai

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd /usr/local/php
cp etc/php-fpm.conf.defautl etc/php-fpm.conf
vi etc/php-fpm.conf
# 修改
user = www-data
group = www-data
# 如果www-data用户不存在则添加www-data用户:
groupadd www-data && useradd -g www-data www-data
# 添加php到环境变量
vi /etc/profile
# 在底部增加一行export PATH=/usr/local/php/bin:$PATH
source /etc/profile
# 检查php cli配置文件
php --ini 若输出路径与--with-config-file-path对应的路径不同,需要建一个软链

启动/重启

1
2
3
#启动:/usr/local/php/sbin/php-fpm
#关闭:kill -INT pid
#重启:kill -USR2 pid

php.ini的问题

偶然发现一个问题,phpinfo()里输出的配置文件路径与php –ini的路径不同。而实际上在编译PHP的时候明确设定了–with-config-file-path参数,设置与phpinfo()输出相同,与php –ini不同。这与文档中描述的有点不一致。

搜索了一把,发现phpinfo()实际对应php/bin/php-cgi,而运行php –ini的时候对应的是php/bin/php,因而两者调用的实际上是不同的可执行文件。只能理解,在我使用的版本里,cli对应的php.ini与cgi的不同。解决方法最简单的则是在php –ini里显示的配置文件路径上放一个php.ini软链,这就好了。

Composer的应用

Composer对于框架的各个组件来说,就好像Container对于各种类一样。如果用一句话来概括Composer的作用,那应该是:

Composer is a tool for dependency management in PHP.

从实际应用的角度,Composer的作用体现在两个方面:

  1. 安装和维护项目依赖的第三方库
  2. 支持项目内部autoload

用Composer安装第三方库

在Composer的支持下,安装和使用第三方库非常方便。大概步骤包括(1)更改composer.json;(2)执行composer install下载和安装库;(3)在项目的入口中引用vendor目录下的autoload.php。一个最简单的composer.json看起来是这样的:

{
“require”: {
“monolog/monolog”: “1.0.*”
}
}

它定义了项目依赖的第三方库。

用Composer支持autoload

虽然autoload.php位于vendor目录下,但它实际上也支持项目自身的autoload。Composer支持4种autoload方式,分别是psr-0、psr-4、classmap和files。其中psr-0/psr-4属于按规则autoload,而classmap和files则属于按配置autoload。所谓“按规则”是指:只要文件命名、文件路径、类命名符合一定规则,autoloader就能根据类的命名空间和类名加载对应的文件。先举个psr-4的例子:


$obj = new App\MyLib\TestComposer();

假设composer.json像下面这样:


{
“autoload”: {
“psr-4”: {
“App\“: “src/“,
}
}
}

那么对应的文件将是src/MyLib/TestComposer.php里的TestComposer类。如果上面的规则是psr-0,那么对应的文件则是src/App/MyLib/TestComposer.php。可以看到两者的差别其实很小,psr-4里是把左边(App\)替换成右边(src/)。psr-0则是把左边连接到右边后面。因此,psr-4的一个主要目的是简化项目的目录结构。

另外两种方式classmap和files比较容易理解,如下面的例子:


{
“autoload”: {
“classmap”: [“src/MyLib/“, “TestComposer.php”],
“files”: [“src/MyLib/functions.php”]
}
}

classmap针对文件里定义的class,可以配置整个目录或某个文件。files则用于加载非class的内容,例如函数实现。

最后,增加了新的文件或修改了composer.json还需要执行


composer dump-autoload

来重新生成autoload逻辑。对于psr-0/psr-4的还可以加-o来优化autoload速度。

安装Nginx

安装

1
2
3
4
5
6
7
8
9
10
11
cd /usr/local/src
wget http://nginx.org/download/nginx-x.x.x.tar.gz
tar -zxvf nginx-x.x.x.tar.gz
cd nginx-x.x.x
./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module \
--with-pcre=/usr/local/src/pcre-xx.xx --with-zlib=/usr/local/src/zlib-x.x.x \
--with-openssl=/usr/local/src/openssl-x.x.x
make
make install

启动

1
sudo /usr/local/nginx/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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
user  www-data;
worker_processes 1;
pid logs/nginx.pid;

events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time"';
#[important] need to specify the index
index index.php index.html index.htm;

access_log logs/access.log main;
error_log logs/error.log;

sendfile on;
tcp_nopush on;
keepalive_timeout 65;

#若有多个server,建议分为多个文件,每个包含一个server模块,用include包含
server {
listen 80;
server_name example.com;

#access_log logs/host.access.log main;

#[important] need to make sure each subpath in the root have +x permission
root /home/work/laravel/public;

#[important] need to do the rewrite here
location / {
try_files $uri $uri/ /index.php?$query_string;
}

#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 {
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#[important] need to have the * below
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}
}

维护

1
2
3
4
5
# 把下面的命令放在脚本里用于备份配置文件
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date "+%b_%d_%Y_%H.%M.%S")
#重新加载conf:
#测试:sudo /usr/local/nginx/nginx -t
#重载:sudo /usr/local/nginx/nginx -s reload