retgb 发表于 2015-8-24 11:20:30

LNMP高级配置

第一部分:完成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 www.iyunv.com;
    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/htpasswdtest // 添加test用户,第一次添加时需要加-c参数,第二次添加时不需要-c参数
在nginx的配置文件中添加
location/ {
                      root /data/www/;
                      auth_basic            "Auth";
                      auth_basic_user_file   /usr/local/nginx/conf/htpasswd;
            }

3. 域名重定向
server_namewww.1.com www.2.com ;

    if ($host != 'www.2.com' ) {
      rewrite^/(.*)$http://www.1.com/$1permanent;      #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;
}
测试结果:
# 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   //把之前的内容清空,然后写入如下配置:


pid = /usr/local/php/var/run/php-fpm.pid               #PID的确定位置,如图所示,是默认的php-fpm配置文档

error_log = /usr/local/php/var/log/php-fpm.log

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                                        #查看那个脚本运行的时间较长                                                                                                                                       参考
request_slowlog_timeout = 1

open_basedir                                                             #限制运行的目录
php_admin_value=/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。


页: [1]
查看完整版本: LNMP高级配置