当前位置:首页 » 编程软件 » nginxshell脚本

nginxshell脚本

发布时间: 2022-11-19 15:57:25

Ⅰ 如何用Shell截取nginx最近10分钟的日志

用shell加awk实现过该功能,感兴趣请追问,下面介绍思路:
先去取得脚本执行时的时刻 例如:1495640600
然后计算得到10分钟前的时刻 为:1495640000
每行日志开头一般是时间,将用awk截取该时间,并利用awk自定义函数将时间转换成时间戳
例如 1495640432
1495640000 < 1495640432 < 1495640600
日志中某行的时间在当前时刻和10分钟前的时刻之间,则让awk打印该行,否则不打印

Ⅱ 如何用Shell截取nginx最近10分钟的日志

这个问题不太适合用shell脚本,perl之类的脚本做这个工作会更高效一些,无论是开发效率还是运行效率。
用shell的话,tail命令是不合适的,根本不知道从哪行开始截,如果还要计算的话,那就把问题复杂化了。用tac命令就是了,tac logfile | {filter logic} | tac,假如日志文件是下面的格式:

192.168.0.1 - - [20/Jun/2013:17:41:48 +0800] "GET / HTTP/1.1" ...那么可以执行下面的命令:

tac log | awk 'BEGIN{ "date -d \"-10 minute\" +\"%H:%M:%S\"" | getline min10ago } { if (substr($4, 14) > min10ago) print else exit }' | tac这组命令没有考虑日期,只比较时间部分。

Ⅲ nginx已停止,可是shell脚本却统计有两个进程

脚本执行是成功的啊。你在脚本最后加上echo$java_HOMEecho$PATHecho$CLASSPATH要判断脚本是否执行成功是输入:echo $? 返回0则成功还有就是,脚本相当于一个子shell。在里面定义变量相当于局部变量,不会对系统本身的系统变量做出改变。所以你在命令行中看echo $JAVA_HOME 不会改变滴!!还有如果你想让脚本定义的系统变量对系统产生影响的话可以用命令source set_java_env.sh

Ⅳ xshee5 怎么打开nginx

需求是这样,提取出nginx日志中,GET或者POST的数据中,名称为’shell’字段的数据nginx日志的format配置:'$proxy_add_x_forwarded_for-$remote_user[$time_local]"$request"''$status$request_body"$http_referer"''"$http_user_agent""$http_x_forwarded_for"$request_time$upstream_response_time';nginx日志实际的内容,大致如下:61.164.xxx.xxx,10.16.xx.x–-[13/Aug/2014:00:00:02+0800]“GET/xxx/xxx?stepid=32&tid=U%2Bo3c0S&&output=json&language=zh_CN&session=114047349&dip=10920&diu=00343B30-9EB8-4B43-A978-FF838587E989&diu3=e9c3afaa4134d678&dia=8E72-1B19E16C0B8E&shell=&compress=false&channel=&adcode=310000&pagenum=1&pagesize=10&sign=/1.1″2004382“-”“xxx-iphone”“61.164.xxx.xxx”0.204或218.202.xxx.xxx,123.103.xxx.xxx,10.16.xxx.xxx–-[2014-08-1922:17:08.446671]“POST/xxx/xxx-web/xxxHTTP/1.1″200stepid=15&tid=U753HifVPE0DAOn%2F&output=json&language=zh_CN&session=114099628&dip=10920&diu=DBDBF926-3210-4D64-972A7&xxx=056a849c70ae57560440ebe&diu2=2DFDB167-1505-4372-AAB5-99D28868DCB5&shell=&compress=false&channel=&sign=&wua=0&appkey=0&adcode=150700&t=0“-”“xxx-iphone”“218.202.xxx.xxx,123.103.xxx.xxx”0.00120.001grep-P'shell'access.log|sed's/\(.*\)&shell=\(.*\)&\(.*\)/\2/g'|awk-F'&''{print$1}'>output.txt命令解释:grep-P'shell'access.log#在日志文件中找到有’shell’关键字的数据行sed's/\(.*\)&shell=\(.*\)&\(.*\)/\2/g'#sed使用正则表达式查找,希望将每行日志分成三个组,’&shell=’之前一组,’&shell=’和shell值和之后的&之间作为第二组,之后的字符串作为第3组,\2代表第二组,用第二组替换整个字符串。但是,sed的正则表达式是贪婪模式,实际的第3组是最后一个&后的字符串awk-F'&''{print$1}'#用&将字符串split,输出第一个结果Shell脚本命令众多,非常灵活,解决方法还有很多。这个不是最优方法,也不十分严格,如果作为重要脚本命令,还需要完善。存在的问题:shell关键在日志中如果不唯一,将导致拆分的结果是错误的。#注意点:sed的正则表达式是贪婪模式

linux下的nginx怎样设置软链接为根目录

nginx服务器绑定域名以及设置根目录非常方便,首先进入nginx安装目录,然后执行vim conf/nginx.conf打开nginx的配置文件,找到

server {

.....

.....

}

这个代码段,这段代码就是用来配置对应站点的,首先我们应该在域名控制面板将域名解析到我们服务器的IP地址,然后绑定才可以生效

首先在我们的代码段中找到server_name这一项然后把后面的域名改成我们要绑定的域名即可

root这一项就是指定的根目录,设置成我们指定的目录即可

其他规则配置也可以像上面一样建立多个文件的方式统一管理,全部配置完毕保存退出,然后重新启动服务器即可生效了

另外listen指定的就是站点端口,可以在不冲突的前提下自定义配置,server_name指定域名、index 指定默认首页、root指定根目录就够了,这样基本的这些配置就能够掌握了

Ⅵ 请问怎样用shell实现nginx日志2xx请求最大值和最小值监控,我刚接触脚本,不太懂,请大神解惑,谢谢

其实蛮简单的,就是从文件中取出需要的值,判断一下就可以了
你给个详细的一行数据出来,看下你到底要取哪几项数据

Ⅶ linux的shell脚本自动配置nginx虚拟主机

nginx-t&&nginx-sreload

Ⅷ nginx 缓存怎么都在tmp

nginx缓存cache的5种方案
1、传统缓存之一(404)
这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。
配置:

location / {
root /home/html/;#主目录
expires 1d;#网页的过期时间
error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下
}
location /fetch/ {#404定向到这里
internal;#指明这个目录不能在外部直接访问
expires 1d;#网页的过期时间
alias /html/;
proxy_store会将文件保存到这目录下
proxy_passhttp://www.jb51.net/;#后端upstream地址,/fetch同时是一个代理
proxy_set_header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。
proxy_store on;#指定nginx将代理返回的文件保存
proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内

}

使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配
置成nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod
777,不过所有有经验的系统管理员都会建议不要随便使用777。
2、传统缓存之二(!-e)
原理和404跳转基本一致,但更简洁一些:

location / {
root /home/html/;
proxy_store on;
proxy_set_header Accept-Encoding '';
proxy_temp_path /home/tmp;
if ( !-f $request_filename )
{
proxy_passhttp://www.jb51.net/;
}
}

可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。
两种传统缓存都有着基本一样的优点和缺点:
缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为
read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持http://www.jb51.net/这种形式的首页和
二级目录http://www.jb51.net/download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一
个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。
缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对
于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://jb51.net/?和http://jb51.net/在squid上会
被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://jb51.net/?1还是http://jb51.net
/?123,均不能透过nginx缓存,从而有效地保护了后端主机。
nginx会非常老实地将链接形式保存到文件系统中,这样对于一个链接,可以很方便地查阅它在缓存机器上的缓存状态和内容,也可以很方便地和别的文件管理器如rsync等配合使用,它完完全全就是一个文件系统结构。
这两种传统缓存都可以在linux下将文件保存到/dev/shm里,一般我也是这么做的,这样可以利用系统内存来做缓存,利用内存的话,清理过期内
容速度就会快得多。使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外,如果有大量小文件和目录,还要修改一下这个内存分区
的inode数量和最大容量:


mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm

上面的命令在一台有3G内存的机器上使用,因为/dev/shm默认最大内存是系统内存的一半就是1500M,这条命令将其调大成2500M,
同时shm系统inode数量默认情况下可能是不够用的,但有趣的是它可以随意调节,这里调节为480000保守了点,但也基本够用了。
3、基于memcached的缓存
nginx对memcached有所支持,但是功能并不是特别之强,性能上还是非常之优秀。


location /mem/ {
if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
{
set $memcached_key "$1";
memcached_pass 192.168.1.2:11211;
}
expires 70;
}

这个配置会将http://jb51.net/mem/abc指明到memcached的abc这个key去取数据。
nginx目前没有写入memcached的任何机制,所以要往memcached里写入数据得用后台的动态语言完成,可以利用404定向到后端去写入数据。
4、基于第三方插件ncache
ncache是新浪兄弟开发的一个不错的项目,它利用nginx和memcached实现了一部分类似squid缓存的功能,我并没有使用这个插件的经验,可以参考:
http://code.google.com/p/ncache/
5、nginx新开发的proxy_cache功能
从nginx-0.7.44版开始,nginx支持了类似squid较为正规的cache功能,目前还处于开发阶段,支持相当有限,这个缓存是把链接用md5编码hash后保存,所以它可以支持任意链接,同时也支持404/301/302这样的非200状态。
配置:
首先配置一个cache空间:

复制代码 代码如下:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=NAME:10m inactive=5m max_size=2m clean_time=1m;

注意这个配置是在server标签外,levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母,保存的文件名就会类
似/path/to/cache/c/29/;keys_zone为这个空间起个名
字,10m指空间大小为10MB;inactive的5m指缓存默认时长5分钟;max_size的2m是指单个文件超过2m的就不缓
存;clean_time指定一分钟清理一次缓存。

location / {
proxy_passhttp://www.jb51.net/;
proxy_cache NAME;#使用NAME这个keys_zone
proxy_cache_valid 200 302 1h;#200和302状态码保存1小时
proxy_cache_valid 301 1d;#301状态码保存一天
proxy_cache_valid any 1m;#其它的保存一分钟
}

ps:支持cache的0.7.44到0.7.51这几个版本的稳定性均有问题,访问有些链接会出现错误,所以这几个版本最好不要在生产环境中
使用。nginx-0.7下目前所知较为稳定的版本是0.7.39。稳定版0.6.36版也是近期更新,如果在配置里没有使用到0.7的一些新标签新功
能,也可以使用0.6.36版。

Nginx缓存的内存占用问题的一般解决方法
1、前些日子某服务被刷,每分钟达到上几百万请求;当时采用了nginx cache来解决的;但是因为某服务不能缓存太久,当时设置了5s,那么带来的问题就是产生大量小文件,而且很快就删除了。

2、通过

free -m

会发现used是27G;但是通过top查看进程占的内存并没有那么多

那内存去哪了?

3、通过查阅资料会发现(cat /proc/meminfo)
Slab: 22464312 kB
SReclaimable: 16474128 kB (这些是内核保持的但是可以释放的inode和dentry的缓存)
SUnreclaim: 5990184 kB

4、这些内存为什么会不自动清理呢?
某机房机器系统版本:Linux 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux(正常,没出现内存快到100%的情况)
某机房机器系统版本:Linux 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux (不释放)

5、通过设置如下参数来设置内存阀值

sysctl -w vm.extra_free_kbytes=6436787
sysctl -w vm.vfs_cache_pressure=10000

Ⅸ 如何让nginx支持Shell CGI脚本求配置方法!

1.首先下载所需的软件
wget -c http://www.cpan.org/moles/by-mole/FCGI/FCGI-0.73.tar.gz
wget -c http://search.cpan.org/CPAN/authors/id/G/GB/GBJK/FCGI-ProcManager-0.19.tar.gz
2.安装所需的软件
#tar zxvf FCGI-0.73.tar.gz
#cd FCGI-0.73/
#perl MakeFile.pl
#make && make install

#tar zxvf FCGI-ProcManager-0.19.tar.gz
#cd FCGI-ProcManager-0.19/
#perl MakeFile.pl
#make && make install
3.用Perl写deamon脚本并启动
启动命令./nginx_perl_daemon.pl > /dev/null 2>&1 &
以下是脚本源码
#!/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);
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 {
$proc_manager = FCGI::ProcManager->new( {n_processes => 5} );
$socket = FCGI::OpenSocket( "127.0.0.1:9999", 10 );
$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();

$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;
}
}
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_p2, fileno(CHILD_RD), 0 );
syscall( &SYS_p2, 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";
}
}
}
4、配置nginx,使其支持cgi
location ~ .*\.(cgi|cgix)?$
{
try_files $uri =404;
fastcgi_pass 127.0.0.1:9999;
fastcgi_index index.cgi;
include fcgi.conf;
}
5、写一个测试的cgi脚本,看看能否输出
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, world.";
该脚本需要执行权限,chmod+x perl.cgi。

6、当浏览器输出Hello world,代表成功。

Ⅹ 请问nginx里面的config是用的shell脚本写的吗

要学linux的话 shell多少还是应该学点的!

热点内容
保时捷卡宴哪个配置比较好 发布:2025-05-13 19:00:08 浏览:725
c语言负数运算 发布:2025-05-13 18:45:21 浏览:428
太空杀电脑版连接不到服务器 发布:2025-05-13 18:40:19 浏览:457
同样的配置为什么跑分不同 发布:2025-05-13 18:39:06 浏览:278
获取linuxcpu序列号 发布:2025-05-13 18:36:35 浏览:738
appleid为什么连接服务器出现问题 发布:2025-05-13 18:17:37 浏览:971
书翁怎么配置 发布:2025-05-13 18:17:36 浏览:911
云数据库mongodb 发布:2025-05-13 18:16:12 浏览:774
A7编程 发布:2025-05-13 18:15:26 浏览:742
python视图 发布:2025-05-13 18:14:01 浏览:759