第一部分:完成LNMP的基础环境搭建
第二部分:nginx
内容一:nginx基础配置
1、nginx基础配置,配置文件在/usr/local/nginx/nginx.conf
配置内容如下:
user nobody nobody; #运行时使用的用户
worker_processes 2; #开启的子进程数
#主进程必须由root启用,因为需启动80端口,系统使用的端口必须由root启动,端口访问0-1023;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/nginx.pid; #nginx.pid的位置和安装的时候有关,可通过nginx -V查询
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 6000; #连接数不能设置太大,不然会出现502的情况
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 3526;
server_names_hash_max_size 4096;
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
'$host "$request_uri" $status'
'"$http_referer" "$http_user_agent"';
sendfile on;
tcp_nopush on;
keepalive_timeout 30;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 8 4k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
client_max_body_size 10m;
client_body_buffer_size 256k;
client_body_temp_path /usr/local/nginx/client_body_temp;
proxy_temp_path /usr/local/nginx/proxy_temp;
fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
fastcgi_intercept_errors on;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 5;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css text/htm application/xml;
include vhosts/*.conf; #该路径为相对路径,相对于nginx.conf的路径,具体包含那个目录如下第三步。
}
2、配置虚拟主机,虚拟主机的存放目录为/usr/local/nginx/vhosts/下
mkdir /usr/local/nginx/vhosts/
vim server1.conf
server
{
listen 80;
server_name localhost;
index index.html index.htm index.php;
root /data/www/; #自定义目录
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock; #连接方式为sock,如果使用IP,则格式为127.0.0.1:9000
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
}
}
注意:“location ~ \.php$”建议应用在server配置的最后
内容二:nginx高级配置
1. 验证默认虚拟主机
listen 80 default_server;
nginx可以设置虚拟主机,但是众多主机中哪一个会是默认的呢?一个未指定的域名将访问到哪个主机上呢?nginx 0.8.21 版本开始支持一个指令 default_server只需要在配置虚拟主机时为listen指令 设置 default_server 即可。
示例:
server
{
listen 80 default_server; # HTTP 的端口, default_server 设置默认站点
server_name _; # 设置绑定的域名 或 _(表示匹配为)
index index.html index.htm index.php; # 设置默认文档
root /www/default; # 设置站点主目录
}
由于www.default.com在虚拟主机中,并没有定义server_name,所以就会自动匹配到定义的默认站点下,"_"表示匹配未指定的域名。所谓的指定域名,指的是server_name参数中,是否指定了域名
2. 用户认证
首先需要安装apache,可以使用yum install httpd 安装
生成密码文件,创建用户
htpasswd -c /usr/local/nginx/conf/htpasswd test // 添加test用户,第一次添加时需要加-c参数,第二次添加时不需要-c参数
在nginx的配置文件中添加
location / {
root /data/www/;
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
3. 域名重定向
server_name www.1.com www.2.com ;
if ($host != 'www.2.com' ) {
rewrite ^/(.*)$ http://www.1.com/$1 permanent; #permanent表示301永久跳转
}
浏览器输入www.test.com直接就跳转到www.1.com
4. 日志相关
4.1 日志切割:
编写脚本:
vim /usr/local/sbin/logbak.sh //加入
#! /bin/bash
datedir=`date +%Y%m%d`
/bin/mv /usr/local/nginx/logs/access.log /usr/local/nginx/bak/access_$datedir.log
/bin/mv /usr/local/nginx/logs/error.log /usr/local/nginx/bak/error_$datedir.log
/bin/mv /usr/local/nginx/logs/nginx_error.log /usr/local/nginx/bak/nginx_error$datedir.log
/bin/kill -HUP `cat /var/run/nginx.pid` #重启nginx.pid,会重新生成各种日志, 注意该目录 路径
日志格式
定义在nginx.conf中,虚拟主机直接调用该格式
log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; #写入到nginx.conf配置文件中
log_format main1 '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"'; //此日志格式为,ip不仅记录代理的ip还记录远程客户端真实IP。
access_log 才能条用log_format定义的格式,如 access_log /data/www/log/access_log main
error_log 以及定义好了相关的日志级别,使用如下所示,error只能跟相应的级别
错误日志error_log日志级别
error_log 级别分为 debug, info, notice, warn, error, crit 默认为crit, 该级别在日志名后边定义格式如下:
error_log /your/path/error.log crit;
crit 记录的日志最少,而debug记录的日志最多。如果你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富。
5. 静态文件不记录日志,配置缓存
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ #~表示匹配
{
expires 30d; #expires 表示缓存的时间
access_log off;
}
location ~ .*\.(js|css)?$ #根据js或者css的格式,写相应的匹配语句
{
expires 12h;
access_log off;
}
6. 防盗链
在 nginx.conf中的server部分中添加如下代码
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ {
valid_referers none blocked server_names *.taobao.com *.baidu.com *.google.com *.google.cn *.soso.com ; // 对这些域名的网站不进行盗链。
if ($invalid_referer) {
# return 403;
rewrite ^/ http://www.1.com/static/image/common/logo.png;
}
}
说明:(本环节的域名为www.test.com)
1、在配置文件中,同一个server配置不同域名,测试防倒链是不成功的。
2、valid_referers只运行那些域名可以访问该网站的图片,如在*.taobao.com是可以引用www.test.com/a.jpg的图片
3、none:表示直接访问图片地址,blocked表示被防火墙添加的referer,server_names指的是对应可以访问的域名
7.针对目录限制php解析
location ~ .*(diy|template|attachments|forumdata|attachment|image)/.*\.php${
deny all;
}
注意:diy|template等指的是某个网站目录;该location必须应用在 “ location ~ \.php$”前,不然不生效。
8.根据user_agent控制
if ($http_user_agent ~ 'bingbot/2.0|MJ12bot/v1.4.2|Spider/3.0|YoudaoBot|Tomato|Gecko/20100315'){
return 403;
}
测试结果:
[root@localhost www]# curl -x192.168.1.107:80 www.1.com -I -A 'bingbot/2.0'
HTTP/1.1 403 Forbidden
-A:表示使用的的user_agent
9.访问控制
黑名单
deny 127.0.0.1;
allow all;
白名单
allow 127.0.0.1;
allow 192.168.31.141;
deny all; #是server下配置,基于全局配置
------------------------------
location /uc_server/ {
allow 192.168.31.0/24;
deny all;
} #基于具体目录的控制
10.基于url内容的控制
if ($document_uri !~ 'abc')
{
return 403; #或者rewrite到其他url
}
第三部分:php-fpm 配置
内容一:配置php-fpm,相当于配置一个pool
vim /usr/local/php/etc/php-fpm.conf //把之前的内容清空,然后写入如下配置:
[global]
pid = /usr/local/php/var/run/php-fpm.pid #PID的确定位置,如图所示,是默认的php-fpm配置文档
error_log = /usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock #一个运行池的表示,如果要使用global地址池,在nginx的虚拟主 机配置的fastcgi_pass参数设置为该值
user = php-fpm #该用户为运行php-fpm,自行建立
group = php-fpm
listen.owner = nobody #和后面的nginx的一致
listen.group = nobody #同上
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
重启php-fpm
killall php-fpm
/usr/local/php/sbin/php-fpm
慢执行日志
slowlog = /path/to/slow.log #查看那个脚本运行的时间较长 参考http://www.jb51.net/article/50408.htm
request_slowlog_timeout = 1
open_basedir #限制运行的目录
php_admin_value[open_basedir]=/data/www/:/tmp/
-----------------------------------------------------------------
动态、静态子进程pm = static/dynamic
如果选择static,则由pm.max_children指定固定的子进程数。
如果选择dynamic,则由以下参数决定:
pm.max_children ,子进程最大数
pm.start_servers ,启动时的进程数
pm.min_spare_servers ,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers ,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
对于专用服务器,pm可以设置为static。