LNMP架构搭建与优化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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架构搭建与优化的主要内容,如果未能解决你的问题,请参考以下文章