docBase="/opt/nginx112/html" debug="5" reloadable="true" crossContext="true">
2、开始修改nginx的配置文件,相对于tomcat的配置文件nginx的修改想对复杂,该文件默认只能相应静态页面的访问请求但是其他类型的文件都
给了配置的例子,下面是一个完整的配置文件,我会着重讲解需要注意的部分;
###############nginx配置文件和常用选项####################
user mysql; #指定想要用哪个用户的权限运行nginx,注意这个不是启动用户
#启动都是用root这个是指对外提供服务的子进程使用的用户
worker_processes 4; #启动时初始进程数量,这个一般与CPU个数相同或二倍
error_log logs/error.log info; #启动和运行错误日志存储路径
pid logs/nginx.pid; #启动后PID文件位置,这个用途和php的pid文件相同
events {
worker_connections 1024; #工作进程的最大连接数,根据硬件性能而定
} #个人理解也就是一个进程所能处理的最大连接数
http {
include mime.types; #反向代理配置,可以打开proxy.conf看看
default_type application/octet-stream; #日志的格式
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 logs/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
server { #从这里开始配置主机,nginx的配置文件很好懂
listen 80; #监听端口
server_name localhost; #这个可以写你的站点例如
charset gb2312; #站点默认字符集,个人体会可有可无
location / { #站点根目录配置
root html; #如果下面也配置了root这里可以省掉
index index.html index.htm; #默认首页文件可以多个用空格隔开
}
error_page 500 502 503 504 /50x.html; #报错页面配置,可有可无
location = /50x.html {
root html;
}
location ~ \.php$ { #关键部分,php文件的解析,所有以“.php”结尾的
root html; #根目录是/opt/nginx112/html的
fastcgi_pass 127.0.0.1:9000; #全部通过fastcgi交给127.0.0.1:9000来解析
fastcgi_index index.php; #首页
fastcgi_param SCRIPT_FILENAME /opt/nginx112/html$fastcgi_script_name; #使用fastcgi的脚本路径
include fastcgi_params;
}
location ~ \.jsp$ { #关键部分,关于jsp文件的解析
proxy_pass #配置很简单,所有的jsp结尾的文件都
} #交给8080端口的tomcat处理
location ^~/icon/ { #最后关于awstats的图标等静态文件的路径配置
root /opt/awstats70/wwwroot; #没有这一项awstats上面所有图片会有变成小叉子
index index.html index.htm;
access_log off; #为了统计信息准确,对该目录的访问不记录日志
error_log off; #同样不记录错误信息
charset gb2312; #对图片来说这项没意义
}
location ~ ^/.*\.pl$ { #为了使
root /opt/awstats70/wwwroot;
fastcgi_index index.cgi;
access_log off; #为了统计信息准确,对该目录的访问不记录日志
error_log off; #同样不记录错误信息
auth_basic "admin"; #为awstats的访问加上访问限制,访问用户名为admin
auth_basic_user_file /opt/nginx112/admin.pass; #admin的密码文件存储位置在/opt/nginx112/admin.pass
#这个文件可以通过apache的htpasswd命令生成,别问我哪找apache
fastcgi_param SCRIPT_FILENAME /opt/awstats70/wwwroot/cgi-bin$fastcgi_script_name; #下面这些都是fastcgi相关的设置
fastcgi_param SCRIPT_FILENAME /opt/awstats70/wwwroot/cgi-bin$fastcgi_script_name; #按照实际情况修改相关路径即可
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
include fastcgi_params;
fastcgi_read_timeout 5m;
fastcgi_pass unix:/opt/nginx112/logs/nginx-fcgi.sock; #这里要注意,需要制定fastcgi套接字文件位置,
} #方便起见我把它放在nginx的logs下了这个路径要记住一会有用
}
}
到这里nginx的配置全部完成,nginx有一个非常方便的功能能够检查nginx的语法错误,并且能够在服务运行中动态重载配置文件
[root@support-bk nginx112]# sbin/nginx -t #-t参数测试配置文件问题,如果有问题会提示哪行有错误
nginx: the configuration file /opt/nginx112/etc/nginx.conf syntax is ok #没问题就OK了
nginx: configuration file /opt/nginx112/etc/nginx.conf test is successful
[root@support-bk nginx112]# sbin/nginx -s reload #执行-s reload重载配置文件
现在php和js解析应该没有问题了但是cgi还有一步要做,因为本身nginx没有cgi脚本解释能力所以需要借助一个perl脚本来完成并且需要安装两个CGI相关工具
一个FCGI一个FCGI-procManager,因为是perl的插件所以安装时编译过程稍有不同
[root@support-bk opt]# cd install/
[root@support-bk install]# tar -xzvf FCGI-0.74.tar.gz
[root@support-bk install]# cd FCGI-0.74
[root@support-bk FCGI-0.74]# perl Makefile.PL #编译时使用perl命令来做makefile
[root@support-bk FCGI-0.74] make ;make install
[root@support-bk install]# tar -xzvf FCGI-ProcManager-0.24.tar.gz
[root@support-bk install]# cd FCGI-ProcManager-0.24
[root@support-bk FCGI-ProcManager-0.24]# perl Makefile.PL
[root@support-bk FCGI-ProcManager-0.24]# make; make install
安装完上述两个辅助包后将下列内容保存到一个文件中,这是一个现成的perl编写的CGI分发脚本,负责处理CGI程序,
整个脚本只有一处地方需要修改,就是在nginx配置中提到过的那个套接字文件路径;
[root@support-bk opt]# vi cgiwrap-fcgi.pl
#############################CGI脚本开始############################
#!/usr/bin/perl -w
use FCGI;
use Socket;
use FCGI::ProcManager;
sub shutdown { FCGI::CloseSocket($socket); exit; }
sub restart { FCGI::CloseSocket($socket); &main; }
use sigtrap 'handler', \&shutdown, 'normal-signals';
use sigtrap 'handler', \&restart, 'HUP';
require 'syscall.ph';
use POSIX qw(setsid);
#&daemonize; we don't daemonize when running under runsv
#this keeps the program alive or something after exec'ing perl scripts
END() { }
BEGIN() { }
{
no warnings;
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=" . shift() . "\n"; };
};
eval q{exit};
if ($@) {
exit unless $@ =~ /^fakeexit/;
}
&main;
sub daemonize() {
chdir '/' or die "Can't chdir to /: $!";
defined( my $pid = fork ) or die "Can't fork: $!";
exit if $pid;
setsid() or die "Can't start a new session: $!";
umask 0;
}
sub main {
#$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 ); #use IP sockets
#$socket = FCGI::OpenSocket( "/var/run/nginx/perl_cgi-dispatch.sock", 10 ); #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!
#foreach $item (keys %ENV) { delete $ENV{$item}; }
$proc_manager = FCGI::ProcManager->new( {n_processes => 5} );
####################该脚本只有下面一行需要改,其他完全照搬复制即可########################
$socket = FCGI::OpenSocket( "/opt/nginx112/logs/nginx-fcgi.sock", 10 )
; #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!
$request =
FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket,
&FCGI::FAIL_ACCEPT_ON_INTR );
$proc_manager->pm_manage();
if ($request) { request_loop() }
FCGI::CloseSocket($socket);
}
sub request_loop {
while ( $request->Accept() >= 0 ) {
$proc_manager->pm_pre_dispatch();
#processing any STDIN input from WebServer (for CGI-POST actions)
$stdin_passthrough = '';
{ no warnings; $req_len = 0 + $req_params{'CONTENT_LENGTH'}; };
if ( ( $req_params{'REQUEST_METHOD'} eq 'POST' ) && ( $req_len != 0 ) )
{
my $bytes_read = 0;
while ( $bytes_read < $req_len ) {
my $data = '';
my $bytes = read( STDIN, $data, ( $req_len - $bytes_read ) );
last if ( $bytes == 0 || !defined($bytes) );
$stdin_passthrough .= $data;
$bytes_read += $bytes;
}
}
#running the cgi app
if (
( -x $req_params{SCRIPT_FILENAME} ) && #can I execute this?
( -s $req_params{SCRIPT_FILENAME} ) && #Is this file empty?
( -r $req_params{SCRIPT_FILENAME} ) #can I read this file?
)
{
pipe( CHILD_RD, PARENT_WR );
pipe( PARENT_ERR, CHILD_ERR );
my $pid = open( CHILD_O, "-|" );
unless ( defined($pid) ) {
print("Content-type: text/plain\r\n\r\n");
print
"Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n";
next;
}
$oldfh = select(PARENT_ERR);
$| = 1;
select(CHILD_O);
$| = 1;
select($oldfh);
if ( $pid > 0 ) {
close(CHILD_RD);
close(CHILD_ERR);
print PARENT_WR $stdin_passthrough;
close(PARENT_WR);
$rin = $rout = $ein = $eout = '';
vec( $rin, fileno(CHILD_O), 1 ) = 1;
vec( $rin, fileno(PARENT_ERR), 1 ) = 1;
$ein = $rin;
$nfound = 0;
while ( $nfound =
select( $rout = $rin, undef, $ein = $eout, 10 ) )
{
die "$!" unless $nfound != -1;
$r1 = vec( $rout, fileno(PARENT_ERR), 1 ) == 1;
$r2 = vec( $rout, fileno(CHILD_O), 1 ) == 1;
$e1 = vec( $eout, fileno(PARENT_ERR), 1 ) == 1;
$e2 = vec( $eout, fileno(CHILD_O), 1 ) == 1;
if ($r1) {
while ( $bytes = read( PARENT_ERR, $errbytes, 4096 ) ) {
print STDERR $errbytes;
}
if ($!) {
$err = $!;
die $!;
vec( $rin, fileno(PARENT_ERR), 1 ) = 0
unless ( $err == EINTR or $err == EAGAIN );
}
}
if ($r2) {
while ( $bytes = read( CHILD_O, $s, 4096 ) ) {
print $s;
}
if ( !defined($bytes) ) {
$err = $!;
die $!;
vec( $rin, fileno(CHILD_O), 1 ) = 0
unless ( $err == EINTR or $err == EAGAIN );
}
}
last if ( $e1 || $e2 );
}
close CHILD_RD;
close PARENT_ERR;
waitpid( $pid, 0 );
} else {
foreach $key ( keys %req_params ) {
$ENV{$key} = $req_params{$key};
}
# cd to the script's local directory
if ( $req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/ ) {
chdir $1;
}
close(PARENT_WR);
#close(PARENT_ERR);
close(STDIN);
close(STDERR);
#fcntl(CHILD_RD, F_DUPFD, 0);
syscall( &SYS_dup2, fileno(CHILD_RD), 0 );
syscall( &SYS_dup2, fileno(CHILD_ERR), 2 );
#open(STDIN, "<&CHILD_RD");
exec( $req_params{SCRIPT_FILENAME} );
die("exec failed");
}
} else {
print("Content-type: text/plain\r\n\r\n");
print
"Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";
}
}
}
###############################CGI脚本结束##############################
脚本文件完成后赋予脚本可执行权限
[root@support-bk opt]# chmod 755 cgiwrap-fcgi.pl #给脚本赋予可执行权限
[root@support-bk opt]# ./cgiwrap-fcgi.pl & #启动CGI解析服务
[root@support-bk opt]# cd nginx112/logs #到配置好的路径下看是否出现了相应的sock文件
由于上面的脚本使用的是root用户执行,因此生成的sock文件属主也是root,而此时nginx的运行用户是mysql,这将导致nginx没有权限使用该scok文件解析CGI
因此需要将文件属主改为mysql
[root@support-bk logs]# chown mysql:mysql nginx-fcgi.sock #修改文件属性
有时还需要重启nginx命令为 kill -HUP `cat /opt/nginx/112/logs/nginx.pid`
Nginx的相关配置到这里结束,下面就开始配置awstats7.0了
3、awstats的配置,主要是修改刚刚生成的配置文件awstats..conf,该文件中内容很多但是需要修改的不多,不需要动的部分都用…………省略;
[root@support-bk awstats70]# cat awstats.192.168.129.234.conf |grep -v '^#'
………………
LogFile="/opt/nginx112/logs/access.log" #第一个要改的地方就是这个日志位置,这能让awstats找到需要分析的日志
#如果有多个站点需要生成多个这样的配置文件
LogType=W
LogFormat=1
LogSeparator=" "
SiteDomain="192.168.129.234" #要分析的站点域名
HostAliases="192.168.129.234 127.0.0.1 localhost" #可以配置该站点别名
DNSLookup=2
DirData="/opt/awstats70/awstats" #分析完成后的数据存在哪个目录,我配置的这个目录需要手都创建
DirCgi="/cgi-bin"
………………………… #其他选项就是不配置也能让awstats正常跑起来
[root@support-bk awstats70]#
[root@support-bk awstats70]# wwwroot/cgi-bin/awstats.pl -update -config= #跟新一下awstats的数据内容就可以看图了
为了能够自动执行分析日志,将这个命令加入到计划任务
05 01 * * * /opt/awstats7/wwwroot/cgi-bin/awstats.pl -update -config=
4、站点的测试
为了验证我们配置的站点是否工作正常可以编辑一个jsp文件和一个php文件看看是否能返回正确结果,这里有2个现成的例子,大家复制代码保存成
对应jsp和php文件就行了,其中第一个PHP文件中用户名和密码都需要自己配置,如果数据库连接成功会在页面结尾显示Success!!字样;
[root@support-bk install]# cat laogao.php
phpinfo();
$link=mysql_connect('localhost','root','111111');
if(!$link)
echo "Fail !!";
else
echo "Success !!";
mysql_close();
?>
[root@support-bk install]# cat jspinfo.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
JSP Info
Environment (环境) |
Values (值) |
Server name (服务器名称) |
<%= request.getServerName() %> |
Server port (服务器端口) |
<%= request.getServerPort() %> |
Remote IP address (客户端IP地址) |
<%= request.getRemoteAddr() %> |
Context attributes (相关属性) |
<%
ServletContext context = getServletContext();
Enumeration en = context.getAttributeNames();
while (en.hasMoreElements()) {
String key = (String)en.nextElement();
Object value = context.getAttribute(key);
out.println("
" + key + " | " + value + " |
"); }
%>
[root@support-bk install]#
[root@support-bk install]# cp /opt/install/jspinfo.jsp /opt/nginx112/html/
[root@support-bk install]# cp /opt/install/laogao.php /opt/nginx112/html/
最后通过浏览器看看自己的劳动成果吧
http:///jspinfo.jsp #将显示出JSP相关信息
http:///laogao.php #显示php相关信息
http:///awstats.pl?config= #将提示输入密码,正确输入后显示访问统计页面信息
后记:
整个NGINX+php+jsp+cgi+mysql+awstats搭建过程就完成了,本文档所有操作均来自实际环境,如果你不想费劲理解相关内容,那么复制粘贴各条命令就
能够创建一个功能完善的站点,当然这只是最初环境的搭建,nginx和php、mysql、tomcat都有很多优化参数可调,限于篇幅原因这里不做叙述。
至于很多人头疼的awstats安装插件的问题个人认为如果需求不是很强烈的话不装也行,现有分析数据足够日常用作使用,如有时间后续会补充插件安装相关文档
阅读(2191) | 评论(1) | 转发(3) |