當前位置:首頁 » 編程軟體 » 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多少還是應該學點的!

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:714
php跳過if 發布:2025-05-12 15:34:29 瀏覽:467
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:131
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:166
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:737
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:149
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:399
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:545
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:632
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:366