apache

apache反向代理

<VirtualHost *:80>
    ServerAdmin yunwei@3mang.com
    ServerName log.3mang.com
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        AuthType Basic
        allowoverride AuthConfig
        order allow,deny
        allow from all
        AuthName "admin"
        AuthUserFile /etc/httpd/.htpassword
        require valid-user
    </Proxy>
    ProxyPass /solr http://127.0.0.1:8983/solr
    ProxyPass /solr/admin/cores http://127.0.0.1:8983/solr/admin/cores
    ProxyPassReverse /solr http://127.0.0.1:8983/solr
</VirtualHost>

代理跨域问题

http://www.jianshu.com/p/699f158b218b

apache的配置
mod_proxy 支持转发代理和反向代理所以配置反向代理时首先需要关闭转发代理关闭方式见下面
配置示例备注
# Put this after the other LoadModule directives
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so

# Put this in the main section of your configuration (or desired virtual host, if using 
# Apache virtual hosts)
# 关闭转发代理
ProxyRequests Off
# 指定使用原始Http header的Host属性,在后端服务需要知道原始Host属性
# 时会很有用,默认是关闭的
ProxyPreserveHost On
Header add Access-Control-Allow-Origin *
Header add Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header add Access-Control-Allow-Headers "Content-Type"
# 对被代理资源的指令说明
<Proxy *>
    # Order说明deny 和 allow的执行顺序
    # 一般这个指令可以解释为默认应用xx规则除了yy规则之外
    # xx和yy规则在Order下方指定
    Order deny,allow
    Allow from all
</Proxy>

# 激活针对特定地址的反向代理
ProxyPass /confluence http://app-server.internal.example.com:8090/confluence
# 这个指令会调整HTTP redirect response Header中的 Location, Content-Location 和 URI
 属性中的URL到代理服务器地址
# 作为反向代理服务时强烈建议开启这个选项,避免透传请求到后端服务
ProxyPassReverse /confluence http://app-server.internal.example.com:8090/confluence
# 对新的url权限进行说明
<Location /confluence>
    Order allow,deny
    Allow from all
</Location>
tomcat的配置

tomcat中的配置左右主要是告诉tomcat redirect或者forward的时候使用代理地址而不是上一节点
所请求的实际服务器地址具体配置如下

<Connector port="9080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="9443"
    proxyName="sample.com" proxyPort="80"/>
上面配置中的proxyName和proxyPort就是告诉tomcat代理服务器的地址和端口在servlet中可以通过
下面的代码获得这两个参数的值

request.getServerName();
request.getSreverPort();

option指令

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

Options指令常见的配置示例代码如下:

<Directory />
#指定根目录"/"启用IndexesFollowSymLinks两种特性。
    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模块生成的一个格式化后的目录列表,并列出该目录下的
所有文件(如下图)Options Indexes指令作用效果

MultiViews
允许使用mod_negotiation模块提供内容协商的"多重视图"。简而言之,如果客户端请求的路径
可能对应多种类型的文件,那么服务器将根据
客户端请求的具体情况自动选择一个最匹配客户端要求的文件。例如,在服务器站点的file文件
夹下中存在名为hello.jpghello.html的
两个文件,此时用户输入Http://localhost/file/hello,如果在file文件夹下并没有hello子
目录,那么服务器将会尝试在file文件夹下
查找形如hello.*的文件,然后根据用户请求的具体情况返回最匹配要求的hello.jpg或者hello.htmlSymLinksIfOwnerMatch
服务器仅在符号连接与目标文件或目录的所有者具有相同的用户ID时才使用它。简而言之,只有当
符号连接和符号连接指向的目标文件或目录的所有者是同一用户时,才会使用符号连接。如果该配置
选项位于<Location>配置段中,将会被忽略。
ExecCGI
允许使用mod_cgi模块执行CGI脚本。
Includes
允许使用mod_include模块提供的服务器端包含功能。
IncludesNOEXEC
允许服务器端包含,但禁用"#exec cmd""#exec cgi"。但仍可以从ScriptAlias目录使用
"#include virtual"虚拟CGI脚本。

apache用户认证

alias /phpredis "/var/www/html/phpredis"
<Directory /var/www/html/phpredis>
    Options Indexes MultiViews
    AuthType basic
    AuthName "welcome test"
    AuthUserFile /etc/httpd/.htpasswd
    require valid-user = user test  #如有其它用户以此 列在 test 之后
</Directory>

htpasswd -c /etc/httpd/.htpasswd 用户名
#第一次创建用户要用到-c 参数 第2次添加用户,就不用-c参数
htpasswd -m .htpasswd 用户名 更改密码
htpasswd -D .htpasswd 用户名 删除用户
重启apache

==================================
通过用户组方式访问
alias /test01 "/data/web/test01/"
<Directory /data/web/test01>
  Options Indexes MultiViews
  AuthType basic
  AuthName "welcome test"
  AuthUserFile /etc/httpd/httppwd
  AuthGroupFile /etc/httpd/httpgrp #用户组文件路径
  require group admin #admin 是用户组
</Directory>

创建用户组配置文件

vi /etc/httpd/httpgrp  #创建路径与配置文件中指定文件相同

内容如下:admin:test #注意test 是已经创建好的用户,如果该组中有其它用户,一次排列以空格隔开

apache2.4语法变化

http://httpd.apache.org/docs/2.4/upgrading.html


In this example, all requests are denied.

2.2 configuration:

Order deny,allow
Deny from all
2.4 configuration:

Require all denied
In this example, all requests are allowed.

2.2 configuration:

Order allow,deny
Allow from all
2.4 configuration:

Require all granted
In the following example, all hosts in the example.org domain are allowed access; all other hosts are denied access.

2.2 configuration:

Order Deny,Allow
Deny from all
Allow from example.org
2.4 configuration:

Require host example.org
In the following example, mixing old and new directives leads to unexpected results.

Mixing old and new directives: NOT WORKING AS EXPECTED

DocumentRoot "/var/www/html"

<Directory "/">
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

<Location "/server-status">
    SetHandler server-status
    Require 127.0.0.1
</Location>

access.log - GET /server-status 403 127.0.0.1
error.log - AH01797: client denied by server configuration: /var/www/html/server-status
Why httpd denies access to servers-status even if the configuration seems to allow it? 
Because mod_access_compat directives take precedence over the 
mod_authz_host one in this configuration merge scenario.

This example conversely works as expected:

Mixing old and new directives: WORKING AS EXPECTED

DocumentRoot "/var/www/html"

<Directory "/">
    AllowOverride None
    Require all denied
</Directory>

<Location "/server-status">
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow From 127.0.0.1
</Location>

access.log - GET /server-status 200 127.0.0.1
So even if mixing configuration is still possible, please try to avoid it
 when upgrading: either keep old 
directives and then migrate to the new ones on a later stage or just migrate 
everything in bulk.

php

apache+php
php.ini  short_open_tag = Off改为
short_open_tag = On
否则php的页面不生效

index.php
<?phpphpinfo();?>

apache虚拟主机

修改/etc/httpd/conf/httpd.conf

基于ip静态
<VirtualHost 192.168.1.11:80>
  ServerName www.test1.com
  DocumentRoot /www/test1/
  <Directory "/www/test1">
    Options Indexes FollowSymLinks
     AllowOverride None
     Order allow,deny
     Allow From All
  </Directory>
</VirtualHost>

<VirtualHost 192.168.1.12:80>
  ServerName www.test1.com
  DocumentRoot /www/test2/
  <Directory "/www/test2">
    Options Indexes FollowSymLinks
     AllowOverride None
     Order allow,deny
     Allow From All
  </Directory>
</VirtualHost>

基于域名静态
NameVirtualHost *:80
<VirtualHost *:80>
  ServerName www.test1.com
  DocumentRoot /www/test1/
  <Directory "/www/test1">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

<VirtualHost *:80> 
  ServerName www.test2.com
  DocumentRoot /www/test2/
  <Directory "/www/test2">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>


基于ip动态
192.168.1.11            www.163.com
192.168.1.22            www.263.com
%1  %2  %3 %4       %1     %2  %3
VirtualDocumentRootIP   /tmp/www/%4
/tmp/www/11
/tmp/www/22

基于域名动态
www.163.com            192.168.1.11
www.263.com            192.168.1.12
VirtualDocumentRoot   /tmp/www/%2
/tmp/www/163
/tmp/www/263

www.163.com            192.168.1.11
www.263.com            192.168.1.12
mail.163.com
VirtualDocumentRoot   /tmp/a/%1/%2
/tmp/a/www/163
/tmp/a/www/263
/tmp/a/mail

apache安全

关闭trace和track方法

/etc/httpd/conf/httpd.conf 添加
TraceEnable Off
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]

apache优化

vim /etc/httpd/conf/httpd.conf
MPM 有两种工作方式:1worker 线程 
         2prefork 进程时(一个连接产生一个进程)

解压     tar fzxv httperf-0.9.0
    cd httperf-0.9.0
    ./configure && make && make install
    vim /tmp/wsesslog
    #session 1 definition 定义一个session,即一个来的访问操作
    /index.html
        /cs.jpg
    /b.html
        /x.jgp

通过脚本可以判定出热点网页:
awk -F \" '{print $2}' /var/log/httpd/access_log | awk '{print $2}' | grep 'html$' | 
sort | uniq -c | sort -nr | head -n 10 
awk ' $7 ~ "html$" {print $7} ' /var/log/httpd/access_log | sort | uniq -c | 
sort -nr | head -n 10

规则    
httperf --hog(优化参数) --server=192.168.18.199(被测试的主机) --rate(测试的频率) 1 --wsesslog=4,1(thinktime),
/tmp/wesslog  
Reply time[ms]:response  transfer 

压缩
<Ifmodule mod_deflate.c>
DeflateCompressionLevel 6
AddOutputFilterByType DEFLATE text/html
</Ifmodule>



并发量  
1、连接进程数的多少
2netstat -ant | grep -i "estab" | wc -l 处于estab状态的数量
3、凡是与80端口有关的都算是并发
4syn estalished

Reply status
2 代表正常
3 代表重定向
4 页面无法请求
5 服务器资源不足

apacheworker模式(如果想用线程方式,建议去用nginxvim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
/etc/inint.d/httpd restart

ps -eo nlwp,pid,user,comm | grep apache

nlwp 产看当前进程中有多少个线程
apache自身
1、日志(可以连接到/dev/null2、文件描述符(限制进程使用的数是10243mkdir -pv /tmp/mm
   mount -o size=500M -t tmpfs none /tmp/mm  
   500M 内存到这个目下,以后在对数据处理时,就相当于往内存中写,而这些数据不会因清空缓存
   而数据丢失,而是相当于做了一个
   预热(保证数据都在内存中,把内存当作硬盘来用)

apacheI/O
1、挂载的时候加上 notime
2BI/O(电梯层:整合、排序 )层用deadline 时时性比较好
3、分raid

apacheMemory
单个apache对内存的使用情况
awk ' $3 ~ "kB" { sum[$1] += $2 } END {for (key in sum) print key,sum[key]"KB"}' smaps
1、与调用的模快有关 LoadModule
2、与进程数多少有关

apache网络 
httpd协议的最重要参数 
1http的连线超时时间  Timeout 默认10S
2KeepAlive on  占用的是内存
   KeepAlive Tmieout 15 
   解决Time_wait数量多的时候
   echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
   echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
   注:短时间内不会有请求页面的时候,不需要开启。通常情况下静态页面开启
网络数据进行压缩,用CPU来换取带宽
注:建议大家用apache作动态页面
wiki.nginx.org nginx优化

php优化调整(都与开发进行沟通)

vim /etc/php.ini
max_execution_time = 600;     最大运行时间,最多占用600S
max_input_time = 600;          最大超时时间
memory_limit = 128M           内存限制
-output_buffering = 4096      数据发送之前需要多少缓存

opcode 操作码
软件 xpc apc
首先保证安装PHP: yum install php -y
安装:rpm -ivh php-eaccelerator-0.9.5.2-2.el5.i386.rpm 
vim /etc/php.d/eaccelerator.ini
eaccelerator.shm_sime = "0"   系统默认的内存 ipcs -l  
eaccelerator.shm_ttl = "3600" 缓存时间
eaccelerator.allowed_admin_path = "/var/www/html/control.php 指定管理页面
eaccelerator.cache_dir = "/var/cache/php-eaccelerator" 缓存的磁盘路径
cp /usr/share/doc/php-eaccelerator-0.9.5.2/control.php /var/www/html 拷贝模板
测试:ab -n 100 -c 10 http://192.168.18.199/time.php
关闭缓存再进行测试,比较两次测试里面的时间


vim /etc/security/limits.conf
* soft nofile 102400
* soft nofile 102400
su -
ulimit -SHn
vim /usr/include/bits/typesizes.h
#define __FD_SETSIZE            102400

cd httperf-0.9.0
./configure && make && make install

测试
1、考虑你的并发量:
httperf --hog --server=192.168.18.199 --rate 500 --wsesslog=5000000,1,/tmp/wesslog
2vim /etc/httpd/conf/httpd.conf
   <IfModule prefork.c>
    StartServers       80
    MinSpareServers    50
    MaxSpareServers   200
    ServerLimit       500
    MaxClients        500
    MaxRequestsPerChild  4000
   </IfModule>
3apache测试脚本 在被测试的机器上运行
vim /tmp/net
netstat -ant|awk '$1 ~ "^tcp" {sum[$NF] += 1} END {for (key in sum) print key,sum[key]}'

    chmod +x /tmp/net
    watch -n 1 /tmp/net
4netstat -ant | grep 18.113(用来测试的机器) | grep -i 'syn_recv' | wc -l
    netstat -ant | grep 18.113(用来测试的机器) | grep -i 'established' | wc -l
    top  load average
    free -m
注:将测试主机和被测试主机的文件描述符都改成 102400
并发:avg        14
     进程数     8900
     进程数+established   8900
     进程数+establishedsyn_baklog  大约3万多