Apache和Nginx配置

image.png

注:本文环境均为CentOS6。

一、Apache部分配置

Apache配置文件路径:/etc/httpd/conf/httpd.conf
Apache默认虚拟主机配置文件(WIN):/etc/httpd/conf/extra/httpd-vhosts.conf
Apache指定运行账户:
在Apache配置文件 httpd.conf 中设置User和Group。

#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User www            //运行账户
Group www           //账户所属组

Apache2.2虚拟主机配置模板:

NameVirtualHost *:80                            //httpd.conf中配置或包含在站点配置文件中

<VirtualHost *:80>                              //站点域名/主机:端口
    <Directory "D:/vhosts/www.test.com">        //站点根目录
        Options -Indexes FollowSymLinks         //不允许列出目录,详情见附文1
    </Directory>
    ServerAdmin admin@www.test.com              //管理员邮箱
    DocumentRoot "D:/vhosts/www.test.com"       //站点根目录
    ServerName www.test.com                     //站点域名
    ServerAlias test12355.com www123.com        //站点别名
    ErrorLog logs/www.test.com-error_log        //错误日志
  # php_admin_value open_basedir "/www/www.test.com;/tmp;"      //目录隔离,详情见附文2
</VirtualHost>

Apache2.4虚拟主机配置模板:

<VirtualHost *:80>                              //站点域名/主机:端口
    ServerName www.test.com                     //站点域名
    ServerAlias test12355.com www123.com        //站点别名
    DocumentRoot "/www/aaa/"                    //虚拟主机站点根目录
    DirectoryIndex index.html index.php         //默认首页文档
    <Directory "/www/aaa/">                     
        Options FollowSymLinks                  //不允许列出目录
        # Options Indexes FollowSymLinks        //允许列出目录
        AllowOverride All
        Require all granted                     //注意2.4和先前版本区别
    </Directory>
    ErrorLog logs/www.test.com-error_log        //错误日志
    # php_admin_value open_basedir "/www/www.test.com;/tmp;"      //目录隔离,详情见附文2
</VirtualHost>

二、Nginx部分配置

Nginx配置文件路径:/etc/nginx/nginx.conf
Nginx默认站点配置文件:/etc/nginx/conf.d/default.conf
Nginx默认虚拟主机配置文件:/etc/nginx/conf.d/virtual.conf

配置Nginx运行账户及文件上传(nginx.conf):

#用户名 用户组
user www www;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections  1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    
    #nginx文件上传大小
    client_max_body_size 50m;
    #nginx文件缓存目录
    client_body_temp_path /tmp/nginx_temp;
    
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
}

Nginx虚拟主机简单配置模板:

server {
    listen 80;                                      //监听端口
    server_name test.com;                           //绑定域名
    
    location / { 
    root /www/test.com/;                            //站点根目录
    index index.html index.htm index.php;           //默认首页文件
    } 
}

server_name可同时指定多个,如:server_name test.com www.test.com *.test.com;

Nginx配置PHP(请先自行安装PHP):

  • 配置php-fpm:
    运行 vi /etc/php-fpm.d/www.conf
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx                //配置php-fpm运行账户为nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx               //配置php-fpm账户组为nginx

设置php自启动: chkconfig php-fpm on
设置nginx自启动: chkconfig php-fpm on
重新启动nginx: service nginx restart
启动php-fpm: php-fpm service php-fpm start

Nginx虚拟主机PHP配置模板:

server
{
    listen 80;
    #listen [::]:80;
    server_name aaa.com www.aaa.com;
    index index.html index.htm index.php default.html default.htm default.php;
    root /www/test.com;
    #error_page 404 /404.html;
    
    location ~ [^/]\.php(/|$) {
    # comment try_files $uri =404; to enable pathinfo
    try_files $uri =404;
    
    #php
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #目录隔离
    fastcgi_param PHP_ADMIN_VALUE "open_basedir=/wwwroot/aaa/:/tmp/:/proc/";
    include fastcgi_params;
    #include pathinfo.conf;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    expires 30d;
    }
    
    location ~ .*\.(js|css)?$ {
    expires 12h;
    }
    access_log /wwwroot/wwwlogs/aaa.log main;
}

附:PHP—FPM运行账户配置:
配置文件/etc/php-fpm.d/www.conf

Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = www
; RPM: Keep a group allowed to write in log dir.
group = www

三、附文


附文1:Apache Options指令详解

Options指令是Apache配置文件中一个比较常见也比较重要的指令,Options指令可以在Apache服务器核心配置(server config)、虚拟主机配置(virtualhost)、特定目录配置(directory)以及.htaccess文件中使用。Options指令的主要作用是控制特定目录将启用哪些服务器特性。

  • Options指令常见的配置示例代码如下:
<Directory />
    #指定根目录"/"启用Indexes、FollowSymLinks两种特性
    Options Indexes FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>

Options指令的完整语法为:Options [+|-]option [[+|-]option]...
简而言之,Options指令后可以附加指定多种服务器特性,特性选项之间以空格分隔。

下面我们来看看Options指令后可以附加的特性选项的具体作用及含义(Apache配置中的内容均不区分大小写):

  • All
    表示除MultiViews之外的所有特性。这也是Options指令的默认设置。

  • None
    表示不启用任何的服务器特性。

  • FollowSymLinks
    服务器允许在此目录中使用符号连接。如果该配置选项位于<Location>配置段中,将会被忽略。

  • Indexes
    如果输入的网址对应服务器上的一个文件目录,而此目录中又没有DirectoryIndex指令(例如:DirectoryIndex index.html index.php),那么服务器会返回由mod_autoindex模块生成的一个格式化后的目录列表,并列出该目录下的所有文件(如下图)。

    image

  • MultiViews
    允许使用mod_negotiation模块提供内容协商的"多重视图"。简而言之,如果客户端请求的路径可能对应多种类型的文件,那么服务器将根据客户端请求的具体情况自动选择一个最匹配客户端要求的文件。例如,在服务器站点的file文件夹下中存在名为hello.jpg和hello.html的两个文件,此时用户输入Http://localhost/file/hello,如果在file文件夹下并没有hello子目录,那么服务器将会尝试在file文件夹下查找形如hello.*的文件,然后根据用户请求的具体情况返回最匹配要求的hello.jpg或者hello.html。

  • SymLinksIfOwnerMatch
    服务器仅在符号连接与目标文件或目录的所有者具有相同的用户ID时才使用它。简而言之,只有当符号连接和符号连接指向的目标文件或目录的所有者是同一用户时,才会使用符号连接。如果该配置选项位于<Location>配置段中,将会被忽略。

  • ExecCGI
    允许使用mod_cgi模块执行CGI脚本。

  • Includes
    允许使用mod_include模块提供的服务器端包含功能。

  • IncludesNOEXEC
    允许服务器端包含,但禁用"#exec cmd"和"#exec cgi"。但仍可以从ScriptAlias目录使用"#include virtual"虚拟CGI脚本。

此外,比较细心的读者应该注意到,Options指令语法允许在配置选项前加上符号"+"或者"-",那么这到底是什么意思呢?
实际上,Apache允许在一个目录配置中设置多个Options指令。不过,一般来说,如果一个目录被多次设置了Options,则指定特性数量最多的一个Options指令会被完全接受(其它的被忽略),而各个Options指令之间并不会合并。但是如果我们在可选配置项前加上了符号"+"或"-",那么表示该可选项将会被合并。所有前面加有"+"号的可选项将强制覆盖当前的可选项设置,而所有前面有"-"号的可选项将强制从当前可选项设置中去除。你可以参考下面的例子:

  • 示例1:
<Directory /web/file>
Options Indexes FollowSymLinks
</Directory>

<Directory /web/file/image>
Options Includes
</Directory>

#目录/web/file/image只会被设置Includes特性
  • 示例2:
<Directory /web/file>
Options Indexes FollowSymLinks
</Directory>

<Directory /web/file/image>
Options +Includes -Indexes
</Directory>

#目录/web/file/image将会被设置Includes、FollowSymLinks两种特性 

备注1:混合使用前面带"+"/"-"和前面不带"+"/"-"的同一可选项,可能会导致出现意料之外的结果。
备注2:使用-IncludesNOEXEC或-Includes时,不论前面如何设置,都会完全禁用服务器端包含。

附文2:open_basedir限制目录详解

  1. open_basedir介绍
    前言:前些日我用lnmp一键安装包出现了open_basedir的问题,因为我把项目目录变了,所以要在的fastcgi.conf下面加上open_basedir的目录
    open_basedir 将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。
    本指令不受安全模式打开或关闭的影响。
  1. open_basedir设置方法
    • 在php.ini 加入 open_basedir="指定目录"

    • 在程序中使用 ini_set('open_basedir', '指定目录');
      但不建议使用这种方法

    • 在apache的httpd.conf中的Directory配置:
      php_admin_value open_basedir "指定目录"
      httpd.conf中的VritualHost:
      php_admin_value open_basedir "指定目录"

    • nginx fastcgi.conf配置
      fastcgi_param PHP_VALUE "open_basedir=指定目录"

    • 说明:用open_basedir指定的限制实际上是前缀,不是目录名。
      也就是说 open_basedir=/home/fdipzone 也会允许访问/home/fdipzone_abc
      如果要将访问限制为目录,请使用斜线结束路径名:
      例如:open_basedir=”/home/fdipzone/”
      如果要设置多个目录,window使用;分隔目录,Linux使用:分隔目录。

  1. 使用open_basedir限制目录访问
    首先创建一个VirtualHost,
    设置open_basedir 为 /home/fdipzone/sites/in.fdipzone.com/
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /home/fdipzone/sites/in.fdipzone.com
    ServerName in.fdipzone.com
    php_admin_value open_basedir "/home/fdipzone/sites/in.fdipzone.com/"
    <Directory "/home/fdipzone/sites/in.fdipzone.com">
        allow from all Options + Indexes
    </Directory>
</VirtualHost>

在上一层目录 /home/fdipzone/sites/ 中创建一个test.txt文件,在in.fdipzone.com中创建php执行以下代码:

<?php
echo file_get_contents('../test.txt');
?>

因为test.txt不在限定的目录范围内,因此php提示警告:

Warning: file_get_contents(): open_basedir restriction in effect. File(../test.txt) is not within the allowed path(s): (/home/fdipzone/sites/in.fdipzone.com/) in /home/fdipzone/sites/in.fdipzone.com/index.php on line 3

  1. 设置open_basedir的性能分析
    open_basedir开启后会影响I/O,因为每个调用的文件都需要判断是否在限制目录内。
    测试程序,读取限制目录内同一文件10000次
<?php
// 记录开始时间
$starttime = getMicrotime();

// 读取10000次文件
for($i=0; $i<10000; $i++){
    file_get_contents('test.txt');
}

// 记录结束时间
$endtime = getMicrotime();

printf("run time %f ms\r\n", ((float)($endtime)-(float)($starttime))*1000);

function getMicrotime(){
    list($usec, $sec) = explode(' ', microtime());
    return (float)$usec + (float)$sec;
}
?>

关闭open_basedir测试:run time 137.237072 ms
打开open_basedir测试:run time 404.207945 ms
开启open_basedir后,执行时间是关闭的3倍。

总结:使用open_basedir可以限制程序可操作的目录和文件,提高系统安全性。但会影响I/O性能导致系统执行变慢,因此需要根据具体需求,在安全与性能上做平衡。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342