nginx源碼腳本
A. 如何解讀Nginx源碼
前提:
1、首先nginx是c語言編寫的,你必須知識要有C語言的編程基礎,否則很痛苦
2、了解web伺服器,反向代理的基本知識,以及HTTP協議,TCP/IP協議的基本知識
如果你已經有豐富的經驗,或者是大牛,那前面的前提就是廢話,可以略過。
看源碼准備:
1、找官網,找貢獻者的博客去了解NGINX是做什麼的,有什麼特性,性能,功能,架構等
2、下載源代碼,從分析main函數開始,大致了解啟動流程,初始化以及一些程序的啟動准備
3、建議找到request邏輯,分析下對請求的整個處理流程,不用很細,慢慢來,一口吃不了大胖子,有問題就先記上再說
4、根據分析request的經驗,拓展分析下nginx的模塊,處理鏈,以及封裝的數據結構如ngx_str_t,ngx_event_t等數據結構
5、到網上找個例子,自己動手去寫個模塊,或修改某個處理邏輯,你一定會遇到問題,這時你可以通過GDB等工具進行分析和調試,這樣加深了你的理解
6、動手寫代碼,看源碼,調試,重復這個過程。
其他
多在網路上找資源和志同道和的技術愛好者或牛人,多交流溝通。
堅持一年,你會有突飛猛進的成績。good luck
B. nginx 源碼 epoll模塊在哪個文件
linux平台上,Nginx使用epoll完成事件驅動,實現高並發;本文將不對epoll本身進行介紹(網上一堆一堆的文章介紹epoll的原理及使用方法,甚至源碼分析等),僅看一下Nginx是如何使用epoll的。
Nginx在epoll模塊中定義了好幾個函數,這些函數基本都是作為回調注冊到事件抽象層的對應介面上,從而實現了事件驅動的具體化,我們看如下的一段代碼:
[cpp] view plain print?
ngx_event_mole_t ngx_epoll_mole_ctx = {
&epoll_name,
ngx_epoll_create_conf, /* create configuration */
ngx_epoll_init_conf, /* init configuration */
{
ngx_epoll_add_event, /* add an event */
ngx_epoll_del_event, /* delete an event */
ngx_epoll_add_event, /* enable an event */
ngx_epoll_del_event, /* disable an event */
ngx_epoll_add_connection, /* add an connection */
ngx_epoll_del_connection, /* delete an connection */
NULL, /* process the changes */
ngx_epoll_process_events, /* process the events */
ngx_epoll_init, /* init the events */
ngx_epoll_done, /* done the events */
}
};
這段代碼就是epoll的相關函數注冊到事件抽象層,這里所謂的事件抽象層在前面的博文中有提過,就是Nginx為了方便支持和開發具體的I/O模型,從而實現的一層抽象。代碼後面的注釋將功能說明得很詳細了,本文就只重點關注ngx_epoll_init和ngx_epoll_process_events兩個函數,其他幾個函數就暫且忽略了。
ngx_epoll_init主要是完成epoll的相關初始化工作,代碼分析如下:
[cpp] view plain print?
static ngx_int_t
ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer)
{
ngx_epoll_conf_t *epcf;
/*取得epoll模塊的配置結構*/
epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_mole);
/*ep是epoll模塊定義的一個全局變數,初始化為-1*/
if (ep == -1) {
/*創一個epoll對象,容量為總連接數的一半*/
ep = epoll_create(cycle->connection_n / 2);
if (ep == -1) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
"epoll_create() failed");
return NGX_ERROR;
}
}
/*nevents也是epoll模塊定義的一個全局變數,初始化為0*/
if (nevents < epcf->events) {
if (event_list) {
ngx_free(event_list);
}
/*event_list存儲產生事件的數組*/
event_list = ngx_alloc(sizeof(struct epoll_event) * epcf->events,
cycle->log);
if (event_list == NULL) {
return NGX_ERROR;
}
}
nevents = epcf->events;
/*初始化全局變數ngx_io, ngx_os_is定義為:
ngx_os_io_t ngx_os_io = {
ngx_unix_recv,
ngx_readv_chain,
ngx_udp_unix_recv,
ngx_unix_send,
ngx_writev_chain,
0
};(位於src/os/unix/ngx_posix_init.c)
*/
ngx_io = ngx_os_io;
/*這里就是將epoll的具體介面函數注冊到事件抽象層介面ngx_event_actions上。
具體是上文提到的ngx_epoll_mole_ctx中封裝的如下幾個函數
ngx_epoll_add_event,
ngx_epoll_del_event,
ngx_epoll_add_event,
ngx_epoll_del_event,
ngx_epoll_add_connection,
ngx_epoll_del_connection,
ngx_epoll_process_events,
ngx_epoll_init,
ngx_epoll_done,
*/
ngx_event_actions = ngx_epoll_mole_ctx.actions;
#if (NGX_HAVE_CLEAR_EVENT)
/*epoll將添加這個標志,主要為了實現邊緣觸發*/
ngx_event_flags = NGX_USE_CLEAR_EVENT
#else
/*水平觸發*/
ngx_event_flags = NGX_USE_LEVEL_EVENT
#endif
|NGX_USE_GREEDY_EVENT /*io的時候,直到EAGAIN為止*/
|NGX_USE_EPOLL_EVENT; /*epoll標志*/
return NGX_OK;
}
epoll初始化工作沒有想像中的復雜,和我們平時使用epoll都一樣,下面看ngx_epoll_process_events,這個函數主要用來完成事件的等待並處理。
[cpp] view plain print?
static ngx_int_t
ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
{
int events;
uint32_t revents;
ngx_int_t instance, i;
ngx_uint_t level;
ngx_err_t err;
ngx_log_t *log;
ngx_event_t *rev, *wev, **queue;
ngx_connection_t *c;
/*一開始就是等待事件,最長等待時間為timer;nginx為事件
專門用紅黑樹維護了一個計時器。後續對這個timer單獨分析。
*/
events = epoll_wait(ep, event_list, (int) nevents, timer);
if (events == -1) {
err = ngx_errno;
} else {
err = 0;
}
if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {
/*執行一次時間更新, nginx將時間緩存到了一組全局變數中,方便程序高效的獲取事件。*/
ngx_time_update();
}
/*處理wait錯誤*/
if (err) {
if (err == NGX_EINTR) {
if (ngx_event_timer_alarm) {
ngx_event_timer_alarm = 0;
return NGX_OK;
}
level = NGX_LOG_INFO;
} else {
level = NGX_LOG_ALERT;
}
ngx_log_error(level, cycle->log, err, "epoll_wait() failed");
return NGX_ERROR;
}
/*wait返回事件數0,可能是timeout返回,也可能是非timeout返回;非timeout返回則是error*/
if (events == 0) {
if (timer != NGX_TIMER_INFINITE) {
return NGX_OK;
}
ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
"epoll_wait() returned no events without timeout");
return NGX_ERROR;
}
log = cycle->log;
/*for循環開始處理收到的所有事件*/
for (i = 0; i < events; i++) {
/*取得發生此事件的連接*/
c = event_list[i].data.ptr;
instance = (uintptr_t) c & 1;
c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1);
/*獲得該連接上的讀事件*/
rev = c->read;
。。。。。。。。。。。。。
/*取得發生一個事件*/
revents = event_list[i].events;
/*記錄wait的錯誤返回狀態*/
if (revents & (EPOLLERR|EPOLLHUP)) {
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
"epoll_wait() error on fd:%d ev:%04XD",
c->fd, revents);
}
if ((revents & (EPOLLERR|EPOLLHUP))
&& (revents & (EPOLLIN|EPOLLOUT)) == 0)
{
/*
* if the error events were returned without EPOLLIN or EPOLLOUT,
* then add these flags to handle the events at least in one
* active handler
*/
revents |= EPOLLIN|EPOLLOUT;
}
/*該事件是一個讀事件,並該連接上注冊的讀事件是active的*/
if ((revents & EPOLLIN) && rev->active) {
if ((flags & NGX_POST_THREAD_EVENTS) && !rev->accept) {
rev->posted_ready = 1;
} else {
rev->ready = 1;
}
/*事件放入相應的隊列中;關於此處的先入隊再處理,在前面的文章中已經介紹過了。*/
if (flags & NGX_POST_EVENTS) {
queue = (ngx_event_t **) (rev->accept ?
&ngx_posted_accept_events : &ngx_posted_events);
ngx_locked_post_event(rev, queue); /*入隊*/
} else {
rev->handler(rev);
}
}
wev = c->write;
/*發生的是一個寫事件,和讀事件完全一樣的邏輯過程*/
if ((revents & EPOLLOUT) && wev->active) {
if (flags & NGX_POST_THREAD_EVENTS) {
wev->posted_ready = 1;
} else {
wev->ready = 1;
}
/*先入隊再處理*/
if (flags & NGX_POST_EVENTS) {
ngx_locked_post_event(wev, &ngx_posted_events);
} else {
wev->handler(wev);
}
}
}
return NGX_OK;
}
本文將關注的兩個epoll函數也就這么一點代碼了,但整個epoll還有添加事件和刪除事件等的相關函數,代碼都很簡單,本文就不做具體的分析了。
寫到此處的時候,我感覺epoll模塊沒有分析的足夠詳細,或者說是沒有足夠的理解作者的用意,如果你有更好的理解,希望能夠告訴我。或許,隨著後面的分析,能夠逐漸的真正明白吧。
在你編譯是 --prefix=指定的目錄下有一個bin目錄,裡面有一個nginx啟動腳本,如果沒有指定,默認在/usr/local/nginx下,即/usr/local/nginx/sbin/nginx
D. 如何用Nginx源碼製作RPM包的詳解
1、查看操作系統版本和內核版本
2、創建相關目錄
/usr/src/redhat/SOURCES //存放源代碼,補丁,圖標等文件。
/usr/src/redhat/SPECS //存放用於管理rpm製作進程的spec文件。
/usr/src/redhat/BUILD //解壓後的文件存放在這里。
/usr/src/redhat/RPMS //存放由rpmbuild製作好的二進制包。
/usr/src/redhat/SRPMS //存放由rpmbuild製作好的源碼包。
3、下載Nginx源碼包
下載源碼包到SOURCES目錄,不需要解壓。
4、手工創建SPEC文件,由於spec文件是由spec語言編寫的,請注意spec語言的語法。
SPEC文件內容如下:
#############################
# Example Spec File For Nginx
# Edited By LaoXu 7.Mar.2013
#############################
Summary: High Performance Web Server
Name: nginx
Version: 1.3.9
Release: el5
License: GPL
Group: Applications/Server
Source:
URL:
Distribution: Linux
Packager: XuYuanzhen <absolutey.>
%description
nginx [engine x] is a HTTP and reverse proxy server, as well as a mail proxy server
%prep
rm -rf $RPM_BUILD_DIR/nginx-1.3.9
zcat $RPM_SOURCE_DIR/nginx-1.3.9.tar.gz | tar -xvf -
%build
cd nginx-1.3.9
./configure --prefix=/usr/local/nginx
make
%install
cd nginx-1.3.9
make install
%preun
if [ -z "`ps aux | grep nginx | grep -v grep`" ];then
killall nginx >/dev/null
exit 0
fi
%files
/usr/local/nginx5、開始RPM製作
在製作RPM包之前,需要安裝必要的編譯工具,如rpmbuild,gcc等。
開始編譯生成rpm包
cd /usr/src/RedHat/SPECS/
rpmbuild -bb nginx.spec //-ba 參數表示同時生成二進制包和源碼包 -bb 參數表示只生成二進制包
經過一段時間的編譯後最終生成了rpm包文件
如圖所示,在/usr/src/redhat/RPMS/x86_64/該目錄下生成了我們需要的rpm包,由於我編譯的操作系統平台是64bit的,所以生成的rpm包也是64位的文件。在指定的目錄下生成RPM,通常用%_topdir變數,需要在宏配置文件中指定,配置文件稱為macrofiles,它們通常為 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,這個在rhel 5.8中可以通過rpmbuild --showrc | grep macrofiles 查看,我們這里在.rpmmacros文件中定義了生產rpm包的路徑為/usr/src/redhat
最後安裝生成的rpm包
至此Nginx源碼製作並安裝成功!
E. 怎麼編譯安裝nginx1.8.1
要編譯安裝Nginx,首先我們要安裝依賴包 pcre-devel 和 zlib-devel:
# yum install pcre-devel zlib-devel -y
程序默認是使用 nobody 身份運行的,我們建議使用 nginx 用戶來運行,首先添加Nginx組和用戶,不創建家目錄,不允許登陸系統
# groupadd nginx
# useradd -M -s /sbin/nologin -g nginx nginx
准備工作完成後就是下載編譯安裝Nginx了,可以從我提供的網盤下載,也可以去Nginx的官網下載。
首先解壓源碼包:
# tar xf nginx-1.4.4.tar.gz
然後 cd 到解壓後的目錄就可以執行 ./configure 了
# cd nginx-1.4.4
指定安裝目錄和運行時用的屬主和屬組,並啟用狀態監控模塊等
# ./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_mole \
--with-http_flv_mole \
--with-http_stub_status_mole \
--with-http_gzip_static_mole \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre
等配置完成後就可以 make && make install 了
# make && make install
# mkdir /var/tmp/nginx/client/ -pv
等編譯安裝完成後在 /usr/local 下就會出現 Nginx 這個目錄了,進入這個目錄後發現目錄非常簡單。它的配置文件存放在 conf 目錄中,網頁文件存放在 html 中,日誌文件存放在 logs 中,sbin 目錄下只有一個可執行程序 "nginx"
接下來我們簡單的為它提供一個服務腳本吧!
# vim /etc/init.d/nginx
新建文件/etc/rc.d/init.d/nginx,內容如下:
#!/bin/bash
# chkconfig:235 85 15
# description: Nginx is an HTTP server
. /etc/rc.d/init.d/functions
start() {
echo "Start..."
/usr/local/nginx/sbin/nginx &> /dev/null
if [ $? -eq 0 ];then
echo "Start successful!"
else
echo "Start failed!"
fi
}
stop() {
if killproc nginx -QUIT ;then
echo "Stopping..."
fi
}
restart() {
stop
sleep 1
start
}
reload() {
killproc nginx -HUP
echo "Reloading..."
}
configtest() {
/usr/local/nginx/sbin/nginx -t
}
case $1 in
start)
start ;;
stop)
stop ;;
restart)
restart ;;
reload)
reload ;;
configtest)
configtest ;;
*)
echo "Usage: nginx {start|stop|restart|reload|configtest}"
;;
esac
之後給這個文件可執行許可權:
# chmod +x /etc/init.d/nginx
好了,現在可以使用 start,stop 這些參數控制Nginx服務了
由於腳本是我自己寫的,還有許多不盡人意的地方,歡迎大家修改和完善!
現在我們就試試啟動服務看看效果吧:
# service nginx start
記得關閉 SElinux 和 iptables 防火牆哦,
# service iptables stop
# setenforce 0
接下來就在瀏覽器中訪問你服務的IP看看效果吧!是不是出項了歡迎的字樣呢
接下來就研究下 Nginx 的配置文件吧!
# vim /usr/local/nginx/conf/nginx.conf
各項參數的意義如下:
worker_processes 1; 工作進程數量
error_log logs/error.log; 日誌文件位置
pid logs/nginx.pid; pid文件位置
worker_connections 1024; 沒進程的連接數
listen 80; 監聽埠
server_name localhost; 主機名
root html; 網站根目錄
index index.html index.htm; 網站索引頁
error_page 500 502 503 504 /50x.html; 訪問錯誤頁面
剩下的其他被注釋掉的代碼塊:
location ~ \.php$ { . . . . . . } 對PHP的支持,需要安裝PHP
server { . . . . . . } 添加server代碼塊能添加虛擬主機
剩下還有監聽443埠的超文本傳輸安全協議 HTTPS server 需要在編譯Nginx時添加ssl的支持
接下來我們試著添加一台虛擬主機吧,虛擬主機的添加可以基於埠,可以基於IP,也可以基於主機名,我們挨個來看看:
基於埠:
首先編輯配置文件,添加server代碼塊,記得要寫到http{ . . . . . . }這個大的代碼塊中。
server {
listen 8080;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
}
這樣就添加了一個監聽8080埠的服務,你也可以定義自己喜歡的埠哦。
接下來檢查下配置文件有沒有問題,如果最後一個單詞顯示successful就代表沒問題了,可以重新啟動Nginx了
# service nginx configtest
# service nginx restart
接下來就給第二個虛擬主機寫一個index吧!首先創建目錄
# mkdir -pv /var/www/html
# echo '<h1>Hi! This is 8080!</h1>' > /var/www/html/index.html
好了 接下來試著在瀏覽器中訪問訪問,記得第二個主機要加上埠訪問哦
現在試著用不同的IP建立虛擬主機吧!我們可以在一塊網卡上綁定多個IP地址的方式來實現
# ifconfig eth0:0 10.0.0.4/8
記得把IP換成你自己的哦!然後ifconfig看看是不是多出來一個網卡IP了呢
讓後繼續修改配置文件,這回要修改兩個地方,一個是原本自帶的站點的 listen 項,一個是自己添加的站點的 listen 項。
基於IP:
server {
listen 10.0.0.3:80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 10.0.0.4:80;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
}
讓他們只監聽不同的IP,用相同的埠
接下來再瀏覽器上用不同的IP來訪問試試吧,及的還得重啟Nginx,先檢查一下,出現錯誤了看看哪裡配置的不對,然後就可以重啟了。
# service nginx congiftest
# service nginx restart
如果配置給網卡的第二個IP不想要了,把它停掉就可以了
# ifconfig eth0:0 down
再 ifconfig 看看是不是沒有了呢
現在試試用不同的主機名吧!也是企業用的最多的方式。我們把兩個站點的listen項都改為80,然後修改service_name項為定義的主機名
基於主機名:
server {
listen 80;
server_name ybmq.com;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name zhzz.com;
location / {
root /var/www/html;
index index.html index.htm;
}
}
然後重啟Nginx吧!
可是我們在瀏覽器上怎麼通過域名訪問呢?要知道我們訪問 啊,qq 啊之類的是通過DNS伺服器的,難道我們還要配置一台DNS伺服器?其實不然,我們通過修改客戶機的 hosts 文件就可以了。hosts文件是一個本地的域名解析文件,我們要解析哪些域名只要把域名和對應的IP寫到一起就可以了。在Windows XP之後的系統中,這個文件位於:
C:\Windows\System32\drivers\etc\hosts
我們用文本編輯器打開,添加兩個相同的IP對應的兩個不同的主機名就可以了。
如下圖所示
如果你打開這個文件發現已經有很多IP地址了,可以直接在最後加入這兩行,也可以直接清空這個文件,不會有什麼問題的。這個文件的用途還可以屏蔽一些網站哦,只需要把網址對於的IP改為 127.0.0.1 也就是本地回環地址,瀏覽器查詢域名對應的IP時時先通過查詢這個文件的,如果查詢到了,不管對錯都不會訪問DNS伺服器了,所以我們給它一個錯誤的地址,那它一輩子也打不開被屏蔽掉的網站了。
好了 接下來就在瀏覽器中試試用用域名訪問你的兩個站點吧。
如果大家還用IP訪問會是什麼情況呢?我不說了,大家還是自己測試吧 哈哈o(^▽^)o
F. Linux系統下nginx日誌每天定時切割的腳本寫法
下面是deepvps自己用的自動每天定時切割Nginx日誌的`腳本,很方便很好用,推薦給大家使用。本腳本也是參考了張宴老師的文章,再次感謝張宴老師。
1、創建腳本/usr/local/nginx/sbin/cut_nginx_log.sh
vi /usr/local/nginx/sbin/cut_nginx_log.sh
輸入以下內容:
#!/bin/bash
# This script run at 00:00
# The Nginx logs path
logs_path=」/home/www/logs/」
mkdir -p ${logs_path}$(date -d 「yesterday」 +」%Y」)/$(date -d 「yesterday」 +」%m」)/
mv ${logs_path}access.log ${logs_path}$(date -d 「yesterday」 +」%Y」)/$(date -d 「yesterday」 +」%m」)/access_$(date -d 「yesterday」 +」%Y%m%d」).log
kill -USR1 `cat /usr/local/nginx/nginx.pid`
2、設置crontab,每天凌晨00:00切割nginx訪問日誌
crontab -e
輸入以下內容:
00 00 * * * /bin/bash /usr/local/nginx/sbin/cut_nginx_log.sh
G. 求大神指導Centos7 源碼編譯安裝Nginx+PHP 配置動靜分離
這個是我的服務的實際 將配置Nginx實現動靜分離,對php頁面的請求轉發給LAMP處理,而靜態頁面交給Nginx,以實現動靜分離。客戶請求靜態數據給Nginx,Nginx直接應答客戶端,當請求動態數據到Nginx時,Nginx讓客戶端去找LAMP,通過代理的方式,LAMP就和客戶端連接了。分別配置動態分離和靜態分離
(1)架設並調試後端LAMP架構,指定的域名,IP地址為xxxx,創建動態頁面test.php。
(2)配置Nginx(xxxx)處理動態頁面請求,並把域名改為 chaodiquan.com 在server{};段中加入以下代碼,檢測語法後,重啟Nginx
(3)客戶端輸入xxxx/test.php 成功後動態分離就實現了,接下來再配置靜態分離
(4)配置Nginx處理靜態頁面請求,在server{};中加入以下代碼,檢測語法後,重啟Nginx
location ~ .*.(gif|jpg|jpeg|bmp|swf)$ { #這段代碼意思是任意網址以這5種格式為結尾就到Nginx根目錄下的html文件夾尋找資源
root html;
expires 1d; #緩存一天}
(5)在nginx的html目錄中,放入圖片aa.jpg,然後在apache的動態測試頁test.php中添加
<html>
<body>
<img src="aaaa/aa.jpg">
</body>
</html>
(6)客戶端輸入xxxx/test.php測試,由於test.php是動態頁面,因此客戶端會找到LAMP架構中的Apache,然後調取圖片aa.jpg是靜態數據,所以從Nginx提取,最後反饋給客戶端。這個是
H. 源碼安裝nginx需要安裝哪些東西
nginx配置裡面配置一個server段,然後把網站的目錄,域名,別名等配置好就可以了。想要好管理配置,用include加個文單花廁拘丿餃搽邪敞矛件,裡面專門配置server段
I. nginx多server日誌分割腳本
1,配置多個server日誌只要在$website變數增加並用空格分開就行。
2,循環創建日誌目錄
3,分割後用xz 壓縮,當然沒安裝可以用gzip bzip2等等。
4,注意我配置nginx日誌文件名為 "access_{{站點網站}}.log" "error_{{站點網站}}.log"
復制代碼 代碼如下:
# !/usr/bin/bash
log_dir="/usr/local/nginx/logs"
back_log_dir="/disk110/nginx_log"
time=`date +%Y%m%d-%H:%M:%S`
website="www.test1.com www.test2.com www.test3.com";
for i in $website
do
if [ ! -d ${back_log_dir}/${i} ]
then
mkdir ${back_log_dir}/${i}
fi
done
for i in $website
do
if [ -s ${log_dir}/access_${i}.log ]
then
mv ${log_dir}/access_${i}.log ${back_log_dir}/${i}/access_${time}.log
fi
if [ -s ${log_dir}/error_${i}.log ]
then
mv ${log_dir}/error_${i}.log ${back_log_dir}/${i}/error_${time}.log
fi
done
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
for i in $website
do
if [ -s ${back_log_dir}/${i}/access_${time}.log ]
then
xz ${back_log_dir}/${i}/access_${time}.log
fi
if [ -s ${back_log_dir}/${i}/error_${time}.log ]
then
xz ${back_log_dir}/${i}/error_${time}.log
fi
done