首页 > 代码库 > LNMP架构搭建与优化

LNMP架构搭建与优化

1,1php编译与安装

LAMP

apache、mysql、php

LNMP

nginx、mysql、php

mysql的安装与LAMP的mysql安装方法一样

先安装mysql再安装php

cd /usr/local/src

wget http://cn2.php.net/distributions/php-5.4.37.tar.bz2  下载

tar jxvf php-5.4.37.tar.bz2 解压

cd php-5.4.37

./configure --prefix=/export/servers/php --with-config-file-path=/export/servers/php/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/export/servers/mysql --with-mysql-sock=/export/Data/mysql/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --disable-ipv6 --with-curl     编译(其中enable-fpm为最关键的工具)

make

echo  $?  查看有没有错误 显示0正确

make install

echo $?

在make install前可以先把本机之前的php目录删除rm -rf /usr/local/php

cp php.ini-production /usr/local/php/etc/php.ini 拷贝配置文件

cp sapi/fpm/init.d.php-fpm /etc/init.d/php/fpm 拷贝启动脚步

chmod 755 /etc/init.d/php-fpm  修改执行权限

chkconfig --add php-fpm  加入系统服务列表

chkconfig php-fpm on 开机启动

cd /usr/local/php/etc/

ls

mv php-fpm.conf.default php-fpm.conf 把样本配置文件重命名

useradd -s /sbin/nologin php-fpm 添加用户php-fpm,编译时指定了用户和组就是php-fpm

service php-fpm start 启动服务

ps aux |grep php-fpm 查看进程

netstat -lnp 查看监听端口

1,2安装nginx

vim /etc/init.d/nginx

黏贴写入保存

:wq

chmod 755!$ 更改权限

chkconfig --add nginx 加入到启动列表

chkconfig  nginx on 开机启动

service nginx start 成功启动

编辑完启动脚本后重新整理配置文件

vim /usr/local/nginx/conf/nginx.conf   打开nginx的配置文件

> /usr/local/nginx/conf/nginx.conf  全部去掉 ,“>” 这个符号之前阿铭介绍过,为重定向的意思,单独用它,可以把一个文本文档快速清空

vim /usr/local/nginx/conf/nginx.conf   打开nginx的配置文件

http://www.apelearn.com/study_v2/chapter18.html,把里面更加nginx配置的内容复制到配置文件里,内容分为两部分,一部分为配置的整体部分,另一部分server为虚拟主机部分,

{{可以把两部分拆分开来,例如不把server部分复制进配置文件里,这配置文件的最后一行gzip下添加include vhosts、*.conf; (nginx支持include)

:wq

pwd

cd /usr/local/nginx/conf/

mkdir vhosts

cd vhosts

vim default.conf

把server部分拷贝过来

在80后添加 default_server

如果为了限制 }}  往后学习再研究。。。

/usr/local/nginx/sbin/nginx  -t  保存配置后,先检验一下配置文件是否有错误存在

service nginx start

ps aux |grep nginx

CtrlR可以快速搜索调用使用过的命令

1,5php-fpm配置文件

/usr/local/php/etc/php.ini管理php的全局配置

/usr/local/php/etc/php-fpm.conf 管理php-fpm服务的配置

> /usr/local/php/etc/php-fpm.conf 清空

http://www.apelearn.com/study_v2/chapter18.html  安装php的7.修改配置文件,拷贝内容

vim /usr/local/php/etc/php-fpm.conf

粘贴内容

[global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /usr/local/php/var/log/php-fpm.log [www]  ([www]是pool的名字,pool在ps aux|grep php-fpm命令下可以显示,创建不同的pool可以监听不同的端口或者控制不同得到域名) listen = /tmp/php-fcgi.sock   (领用sock的方式监听,可以改为/tmp/www.sock) user = php-fpm group = php-fpm pm = dynamic (动态的,管理下面的pm.,所有改为static,只有pm.max_children = 50 有效) pm.max_children = 50 (最大50个子进程) pm.start_servers = 20 (一开始20个) pm.min_spare_servers = 5 (空闲时最少) pm.max_spare_servers = 35 (空间时最多) pm.max_requests = 500 (每一个子进程 在生命周期内一共处理多少个请求,自动销毁) rlimit_files = 1024 (每一个进程所使用文件描述符的限制)

再创一个pool

[www1] listen = /tmp/www1.sock user = php-fpm group = php-fpm pm = dynamic pm.max_children = 50 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 500 rlimit_files = 1024

:wq

/usr/local/php/sbin/php-fpm -t 检查文件有没有错误

/etc/init.d/php-fpm restart

ps aux|grep php-fpm  查看pool

启动多个pool的好处

不同的pool控制不同的域名,也可以不同域名共用一个pool

pool可以分开使用不同权限

若只用一个pool,一个网站挂了其他也会跟着挂

跟踪操作

网站运行浏览慢

在【www】最后添加

slowlog =  /tmp/www_slow.log

request_slowlog_timeout = 1 (脚本执行时间超过一秒就记录slow.log,让自己看到脚本哪里进行慢,

利用/tmp/www_slow.log排查出问题)

php_admin_value[open_basedir]=/data/www/:/tmp/  (不同的pool设置不同的open basedir,限制不同的域名)

:wq

1,6常见的502问题解决

nginx的高级配置

把之前装的论坛 discuz实现在nginx下访问

之前用的域名 www.test.com

cd /usr/local/nginx/conf/vhosts/

ls

mv 111.conf  test.conf

vim test.conf

server name 改为www.test.com;

#禁用一个fastcgi_pass,另一个改为unix;/tmp/www.sock ;

:wq

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

外部浏览器访问www.test.com

出现502问题

查看nginx的错误日志error_log

error_log的位置可以在nginx.com里查看

vim /usr/local/nginx/conf/nginx.conf

找出error_log的位置

cat vim /usr/local/nginx/logs/nginx_error.log

找出错误,出现502,发现权限不够,不能读写该文件

ls -l /tmp/www.sock

vim /usr/local/php/etc/php-fpm.conf

group下添加配置,关于监听的用户和组的指定nobody

listen.owner = nobody

listen.group = nobody

:wq

/etc/init.d/php-fpm restart

外部访问

www.test.com

解决了502问题


1,7nginx用户认证

双层密码,在进入admin前还要再输一层密码

cd /usr/local/nginx/conf/vhosts

ls

vim test.conf

在root下面添加

location ~ .*admin\.php$ {

auth_basic "aminglinux auth";

auth_basic_user_file /usr/local/nginx/conf/.htpasswd;

把下面的include、fastcgi_pass、fastcgi_index、fastcgi_param都拷贝到这里

}

:wq

利用apache生成密码的工具htpasswd创建文件 /usr/local/nginx/conf/.htpasswd

(若没有htpasswd,就yum install httpd)

htpasswd -c  /usr/local/nginx/conf/.htpasswd  aming

输入密码

创建用户和密码成功,若想再创建另一个用户,则不用-c和更加名字

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

验证:curl -x127.0.0.1:80 -uaming:密码  www.test.com/admin.php

显示出</tr></table></body></html>等就证明php已解析,创建成功

也可以外部浏览器登陆www.test.com/进入管理中心


1,8nginx域名跳转

和apache的域名别名相似

vim /usr/local/nginx/conf/vhosts/test.conf

一个网站多个域名

在server_name 后所有域名都直接写上

例如www.test.com为主,www.aaa.com为次

永久重定向301或302,目的:让搜索引擎更加友好,加重对域名的权重,让网友更容易搜索到页面和域名

server_name www.test.com www.aaa.com;

if ($host !=‘www,test.com‘)

{

rewrite ^/(.*)$ http ://www.test.com/$1 permanent;  (301)

}

:wq

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

curl -x127.0.0.1:80 www.aaa.com/afafwaegeges -I(大写i)

验证301和跳转到www.test.com/afafwaegeges

(lst - 基本上都用这个Flag,break - 中止Rewirte,不再继续匹配,redirect -返回临时重定向的HTTP状态302,permanent - 返回永久重定向的HTTP状态301。。。更多了解寻找nginx中如何配置301和302的帖子)

1,9nginx不记录指定文件类型日志

vim /usr/local/nginx/conf/vhosts/test.conf

log_format 就是日志的格式 combined_realip 就是日志的名字,可以改为简单些,列如改为aming,remote_addr远程ip,http_x_forwarded_for 代理ip,time时间,host域名,uri访问的地址,status状态码

vim /usr/local/nginx/conf/vhosts/test.conf

在root下面添加

access_log /tmp/access.log aming;

:wq

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

curl -x......或者外部浏览器访问一下

cat  /tmp/access.log  查看日志的记录

不记录静态图片或者指定格式的东西

vim /usr/local/nginx/conf/vhosts/test.conf

在location 。。admin。。php下一段添加

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

access_log off;

}

location ~ (static|cache)

{

access_log off;

}

:wq

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

curl -x......或者外部浏览器访问一下

cat  /tmp/access.log  查看日志的记录

日志里已经不记录上面指定的东西了


2,0nginx日志切割

需要自己写一个日志切割的脚本

vim /usr/local/sbin/nginx_logrotate.sh

#!/bin/bash d=`date -d "-1 day" +%F` (今天切割昨天的日志) [ -d /tmp/nginx_log ] || mkdir /tmp/nginx_log (|| 前面命令成功就不执行后面命令,不成功就执行后面命令) mv /tmp/access.log   /tmp/nginx_log/$d.log /etc/init.d/nginx reload > /dev/null (重定向) cd /tmp/nginx_log/ gzip -f $d.log  (压缩日志和强制覆盖)

sh -x /usr/local/sbin/nginx_logrotate.sh 执行脚本显示过程

应该把执行切割日志的任务命令加入到任务计划里面去,每天都进行切割日志


2,1nginx配置静态文件过期时间

静态文件的缓存,即过期时间

vim /usr/local/nginx/conf/vhosts/test.conf

使用location方式

在access_ log off;下添加

expires 15d  ;(保存15天)

:wq

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

在浏览器论坛页面按F12,Network查看设置的指定格式文件的max-age过期时间

也可以用curl -x指令访问文件的URL地址,查看max-age

2,2nginx配置防盗链


依据referer

防盗链也在location里配置

vim /usr/local/nginx/conf/vhosts/test.conf

例如为 gif|jpg|jpeg 等配防盗链

  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|mp4|flv|rar|zip|gz|bz2)$

   {

         expires 15d;

         access_log off;

         valid_referers none blocked *.test.com *.aaa.com;(允许这两个域名使用)

         if ($invalid_referer)

       {

             return 403;  (其他域名使用这些文件会显示403)

          }

   }

:wq

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

在浏览器论坛页面按F12,Network查看设置的指定格式文件的url

用curl -e"要使用的ip地址" -I -x127.0.0.1:80 ‘该图片或文件的URL’

查看防盗链是否生效

2,3nginx访问控制

设置白名单:允许访问的ip

设置黑名单:拒绝访问的ip

vim /usr/local/nginx/conf/vhosts/test.conf

要设置整个网站的限制,在location外,root下添加

allow 允许的ip;

deny all; (白名单)

deny 禁止的ip;

(黑名单)

要设置网站内某些地方的限制,列如管理员中心,在location admin那段中添加

allow 允许的ip;

deny all; (白名单)

deny 禁止的ip;

(黑名单)

192.168.1.0/24 整个192.168.1的网段


2,4nginx禁止指定user_agent

网站访问很大,服务器空间资源不够,通过user_agent禁止某些不重要搜索链接

vim /usr/local/nginx/conf/vhosts/test.conf

在location外添加

if ($http_user_agent ~* ‘curl|baidu|1111‘)  (~*同时用不区分大小写匹配)

{

return 403;

} (user_agent含有curl,baidu,1111都会禁止访问)

:wq

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

测试

curl -A “随便赋予的user_agent” -x。。。。

若随便赋予的user_agent里含有curl,baidu,1111都会显示出403)

2,5nginx代理详解

假设代理百度一个ip地址

vim /usr/local/nginx/conf/vhosts/proxy.conf

server{

listen 80;

server_name www.baidu.com;

location / {

proxy_pass http://百度的ip(可用ping www.baidu.com查看)/;

# proxy_set_header Host $host;

}

}

:wq

假设代理百度两个个ip地址

vim /usr/local/nginx/conf/vhosts/proxy.conf

upstream aming{

server 第一个百度ip;

server 第二个百度ip ;

}

server {

listen 80;

server_name www.baidu.com;

location / {

proxy_pass http://aming/;

proxy_set_header Host $host;

}

}

:wq


LNMP架构搭建与优化