1、如何實現 Nginx 代理的節點訪問日志記錄客戶的 IP 而不是代理的 IP?
在nginx代理文件中怎加一行配置文件:proxy_set_header X-Real-IP $remote_addr;
2./var/log/messages 日志出現 kernel: nf_conntrack: table full, dropping packet.請問是什么原因
導致的?如何解決?
這是iptables的報錯信息“連接跟蹤表已滿,開始丟包”,再想到網站那面將memcached的連接改為短連接,由於iptables會記錄每個連接的跟蹤信息,而連接關閉關閉過於頻繁導致連接跟蹤表滿,出現丟包。
解決方法:
首先將memcached的連接方法改為長鏈接,然后再針對nf_conntrack進行修改,主要有以下幾種方式:
1.關閉防火牆
2.加大iptables跟蹤表大小,調整對應的系統參數
3.使用裸表,不添加跟蹤標志
4.刪除連接跟蹤模塊
3.linux 系統 nginx php 環境,發現 PHP-FPM 進程占用 CPU 高,請問可能的原因,以及如
何解決?
一、進程跟蹤
# top //找出CPU使用率高的進程PID
# strace -p PID //跟蹤進程
# ll /proc/PID/fd //查看該進程在處理哪些文件
將有可疑的PHP代碼修改之,如:file_get_contents沒有設置超時時間。
二、內存分配
如果進程跟蹤無法找到問題所在,再從系統方面找原因,會不會有可能內存不夠用?據說一個較為干凈的PHP-CGI打開大概20M-30M左右的內存,決定於PHP模塊開啟多少。
通過pmap指令查看PHP-CGI進程的內存使用情況
# pmap $(pgrep php-cgi |head -1)
按輸出的結果,結合系統的內存大小,配置PHP-CGI的進程數(max_children)。
三、監控
最后,還可以通過監控與自動恢復的腳本保證服務的正常運轉。下面是我用到的一些腳本:
只要一個php-cgi進程占用的內存超過 %1 就把它kill掉
#!/bin/sh
PIDS=`ps aux|grep php-cgi|grep -v grep|awk’{if($4>=1)print $2}’`
for PID in $PIDS
do
echo `date +%F….%T`>>/data/logs/phpkill.log
echo $PID >> /data/logs/phpkill.log
kill -9 $PID
done
檢測php-fpm進程
#!/bin/bash
netstat -tnlp | grep “php-cgi” >> /dev/null #2&> /data/logs/php_fasle.log
if [ "$?" -eq "1" ];then #&& [ `netstat -tnlp | grep 9000 | awk '{ print $4}' | awk -F ":" '{print $2}'` -eq "1" ];then
/usr/local/webserver/php/sbin/php-fpm start
echo `date +%F….%T` “System memory OOM.Kill php-cgi. php-fpm service start. ” >> /data/logs/php_monitor.log
fi
通過http檢測php執行
#!/bin/bash
status=`curl -s –head “http://127.0.0.1:8080/chk.php” | awk ‘/HTTP/ {print $2}’`
if [ $status != "200" -a $status != "304" ]; then
/usr/local/webserver/php/sbin/php-fpm restart
echo `date +%F….%T` “php-fpm service restart” >> /data/logs/php_monitor.log
fi
4.一主多從,主庫宕機,如何切換到從庫,其他的從庫如何處理?
1.確保所有的relay log全部更新完畢,在每個從庫上執行stop slave io_thread; show processlist;直到看到Has read all relay log,則表示從庫更新都執行完畢了
2.登陸所有從庫,查看master.info文件,對比選擇pos最大的作為新的主庫。
3.登陸192.168.1.102,執行stop slave; 並進入數據庫目錄,刪除master.info和relay-log.info文件, 配置my.cnf文件,開啟log-bin,如果有log-slaves-updates和read-only則要注釋掉,執行reset master
4.創建用於同步的用戶並授權slave,同第五大步驟
5.登錄另外一台從庫,執行stop slave停止同步
6.根據第七大步驟連接到新的主庫
7.執行start slave;
8.修改新的master數據,測試slave是否同步更新
5.誤操作 drop 語句導致數據破壞,請給出恢復思想及實際步驟。
思想:
法1: 1、通過防火牆禁止web等應用向主庫寫數據或者鎖表,讓數據庫停止更新。
##檢查全備及binlog日志 ;
2、將全備恢復;
mysqlbinlog -d databasename mysql-bin.000014 > bin.sql
3、將所有binlog匯總,轉成sql語句,剔除drop語句,恢復數據;
mysql -uroot -p123456 databasename < bin.sql
(注意數據的備份,不要破壞原始數據)
4、后續:(數據無法寫入)所以無需恢復。
5、如果是update語句(也需要停止訪問)
法2:1、如果主庫持續有數據寫入;
2、停止一個從庫;然后在主庫刷新binlog;
3、把mysql-bin.000014恢復成bin.sql(去掉drop語句);
4、把全備數據sql及操作前的增量bin.sql恢復到從庫。
5、停止主庫;把主庫刷新后的binlog解析為sql恢復到從庫;
5、切換為從庫提供服務;
#法2可能會有主鍵沖突等其它的問題,可以通過修改id或者延遲解決,盡量使用法1停庫解決;
#平時工作要注意數據庫的權限管理及流程管理,防患於未然。
6.請舉一個生產中實際的例子網站打開慢由於數據庫慢導致的。
數 據庫負載高,有慢查詢,做聯合索引案例
數據庫負載高,有慢查詢,分析web日志,可能有爬蟲,封其ip
7. 通過 kill -9 野蠻粗魯殺死數據庫導致數據庫啟動故障,給出排除方法或者經驗。
暫時沒有答案:
8.IDC 機房帶寬突然從平時 100M 增加到 400M,請你分析問題所在,並解決。
.真實遭受DDOS攻擊(遇到過幾次,造成影響的不多見,其中還有黑客勒索的案例)。
b.內部服務器中毒,大量外發流量(這個問題老男孩接警5次以上)
c.網站元素(如圖片)被盜連,在門戶頁面被推廣導致大量流量產生(接警3次以上)
d.合作公司來抓數據,如:對合作單位提供了API數據接口(有合作的公司的朋友了解這個)
e.購買了CDN業務,CDN猛抓源站(這個次數也不少)。
9.正在工作的 linux,發現文件系統只讀了,你覺得導致問題的原因是什么,如何解決?
1、重啟看是否可以修復(很多機器可以)
2、使用用 fsck – y /dev/hdc6 (/dev/hdc6指你需要修復的分區) 來修復文件系統
3、若,在進行修復的時候有的分區會報錯,重新啟動系統問題依舊
查看下分區結構
[root@localhost ~]# mount
/dev/sda3 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (ro)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
查看ro掛載的分區,如果發現有ro,就重新mount
umount /dev/sda1
mount /dev/sda1 /boot
如果發現有提示“device is busy”,找到是什么進程使得他busy
fuser -m /boot 將會顯示使用這個模塊的pid
fuser -mk /boot 將會直接kill那個pid
然后重新mount即可。
4、直接remount,命令為
[root@localhost ~]# mount -o rw,remount /boot
10.磁盤報錯“No space left on device”,但是 df -h 查看磁盤空間沒滿,請問為什么?
1.1首先查看我們的磁盤剩余情況
[root@admin /]# df -h #發現磁盤沒有滿 還有%47
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 3.1G 3.5G 47% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 33M 147M 19% /boot
1.2 創建目錄測試報錯
#創建目錄報錯文件還是正常
[root@admin/]# mkdir test
mkdir: cannot create directory `test': No space left on device
#查看磁盤inode
[root@admin/]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 462384 462384 0 100% /
tmpfs 125517 1 125516 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
#最后發現目錄backup中inode 滿了
[root@admin/]# df -i /backup/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 462384462384 0 100% /
1.3解決方案
#刪除backup目錄中不常用的文件數據
#由於本文是測試inode滿 所以刪除所有數據,工作中要注意匯報上級。
[root@admin /]# \rm -rf /backup/
#公司解決方案
刪除/backup目錄中的部分文件,釋放出/backup分區的一部分inode,特別要留意那些spool出來的文件,這種文件一般會占用比較多的節點,因為比較小而且零碎,同時要多留意日志文件信息等
2、用軟連接將空閑分區/opt中的newcache目錄連接到/data/cache,使用/opt分區的inode來緩解/backup分區inode不足的問題:
ln-s /opt/newcache /data/cache
3、更換服務器,用高配置的服務器替換低配置的服務器。很多時候用錢去解決問題比用技術更有效,堆在我辦公桌上5台全新的DELL PowerEdge 1950 服務器即將運往IDC機房。一般不建議
1.4檢查inode
Filesystem InodesIUsed IFree IUse% Mounted on
/dev/sda3 462384 59141403243 13% /
tmpfs 125517 1 125516 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
11、磁盤空間滿了,刪除了一部分 nginx access 日志,但是,發現磁盤空間還是滿的,請問
為什么?
刪除的日志信息,一部分可能還是被進程調用,因此,需要重啟nginx服務來釋放進程;
或者實際生產環境中使用&gt;/log/access.log清空文件
12.請利用 shell 開發一個 rsync 服務的啟動停止腳本並通過 chkconfig 進行開關機管理
root@sky9896 /]# chkconfig --add rsyncd
rsyncd 服務不支持 chkconfig
[root@sky9896 /]# cat /etc/init.d/rsyncd
#/bin/bash
# chkconfig: 2345 20 80 #添加該條即解決服務支持chkconfig
[root@sky9896 /]# chkconfig --add rsyncd
[root@sky9896 /]# chkconfig --list rsyncd
rsyncd 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
[root@sky9896 /]# /etc/init.d/rsyncd start
-bash: /etc/init.d/rsyncd: 權限不夠
[root@sky9896 /]# chmod 777 /etc/init.d/rsyncd #授權后,即解決
[root@sky9896 /]# /etc/init.d/rsyncd start #啟動服務
rsyncd is started.
[root@sky9896 /]# netstat -lnt|grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN
tcp 0 0 :::873
設置開機自啟動的過程:
[root@sky9896 /]# chkconfig --add rsyncd #添加服務
[root@sky9896 /]# chkconfig --list rsyncd #顯示服務
rsyncd 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
[root@sky9896 /]# chkconfig --del rsyncd #刪除該服務
[root@sky9896 /]# chkconfig --list rsyncd
rsyncd 服務支持 chkconfig,但它在任何級別中都沒有被引用(運行“chkconfig --add rsyncd”)
13.寫一個 tomcat 啟動腳本,手工 OK,但是放入定時任務就是不執行,請問為什么?
最近遇到了一些sh不能在crontab定時任務中自動執行的問題
期間由於不太了解,故走了一點彎路,現在總結下來可能第一次
進行設置遇到的問題。以絕后患!我所用過的操作系統為HP-unix&linux&sco-unix,均測試通過
1,首先確保sh腳本具有可執行屬性
即chmod +x ***.sh
或chmod +777 ***.sh
2,確保sh腳本手工執行正常
即在當前系統內手工執行sh腳本以后能收到自己期望得到的結果
3,加載環境變量
這個問題是經常容易被忽略的問題,通常我們在第二步的時候手動執行腳本能得到自己想要的結果,可是設置好crontab之后,總不能得到自己想要的結果,總感覺腳本沒有被執行。或者執行后沒有得到正常的結果。很多均是由於沒有加載所在用戶的環境變量所引起的。因此最好在自己的腳本首兩行添加環境變量的導入。如下:其中telstar是我在操作系統下所在的用戶。在該目錄下執行ls -a可以查看到.cshrc文件。我們在自己的sh腳本中增加source 該文件,將本用戶的環境變量加載,那么以下的內容就能正常被執行了
#!/bin/csh#source /telstar/.cshrc
下面貼出我的定時重啟tomcat的一個例子
#!/bin/csh#source /telstar/.cshrckill -9 `ps -ef | grep Djava.uti | grep -v tail | grep -v vi | grep -v grep | awk '{print $2}'`cd /telstar/tomcat/binsleep 15./startup.sh &
其實這里不加載環境變量的話,sh前加上絕對路徑,應該也可以,這個沒有測試,有興趣的朋友可以嘗試一下
#!/bin/csh
#source /telstar/.cshrc
kill -9 `ps -ef | grep Djava.uti | grep -v tail | grep -v vi | grep -v grep | awk '{print $2}'`
sleep 15
/telstar/tomcat/bin./startup.sh &
總之很多手動能正常執行的sh,crontab不能執行大多數情況是由於沒有加載環境變量引起的,這里貼出來,以絕后患
#!/bin/csh
#source /telstar/.cshrc
kill -9 `ps -ef | grep Djava.uti | grep -v tail | grep -v vi | grep -v grep | awk '{print $2}'`
cd /telstar/tomcat/bin
sleep 15
./startup.sh &
14.apache 服務的常用工作模式及對應特點,企業如何選擇對應模式。
apache的工作模式有:beos,event,worker,prefork,mpmt_os2。
查看:http –l
apachectl –l
beos工作模式(跟linux關系不大,或者暫時用不上)
在Beos系統上的工作模式,使用一個單獨的控制線程來創建和控制處理請求的工作線程。
event工作模式(不太穩定,或者說暫時用不上)
event 模式由於把服務進程從鏈接中分離出來,在開啟KeepAlive場合下相對worker模式能夠承受的了更高的負載。event模式為 worker開發的變種模式,配置以及指令與worker完全相同。不過event模式不能很好的支持https的訪問,有時還會出現一系列的問題。
worker工作模式(與php配合不好)
worker模式由於使用線程來進行處理請求,所以能夠處理海量請求,而系統資源的開銷要小於基於進程的服務器。同時worker模式也使用了多進程,每個進程又有着多個線程,以獲得基於進程服務器的穩定性。
mpmt_os2工作模式(很少用,或者說暫時用不上)
mpmt_os2是專門針對OS/2優化過的混合多進程多線程多路處理模塊(MPM) 。
重點:prefork工作模式。
1、編譯的時候使用#–with-mpm=prefork對應的工作模式名稱來修改工作模式。
2、prefork工作模式是linux下apache安裝時候的默認工作模式,是使用最普遍的工作模式。
3、原理:有一台正在運行的apache服務器,用戶A訪問該apache的時候apache建立一個新的進程1處理用戶A的請求。
這時又有一個用戶B訪問該apache,apache又建立一個新的進程2處理用戶B的請求。
后來又有用戶C,D,E訪問該apache,apache又建立三個進程3,4,5處理他們的請求。
如果每當一個新用戶訪問該apache,apache再建立一個新的進程處理用戶的請求,是不是太慢了呢?
所以apache的prefork模式在apache第一次啟動的時候就建立5個進程,等待用戶的連接請求,有一個用戶訪問,就有一個進程處理他的請求。
那么如果有5個用戶同時訪問apache,apache第一次建立的5個進程全部用光了,所以apache就再從新在建立5個進程,等待下一批用戶的請求。
prefork模式會根據服務器的硬件情況,設定apache最多只能同時建立256個進程。再多的請求就只能等待前面的進程處理完畢在進行處理。
15.請描述 raid 0 1 5 10 的原理、相關特點 ,性能區別,集群中各角色如何選擇 RAID。
RAID是磁盤冗余陣列(redundant array of independent disks)簡稱磁盤陣列。
RAID是一種把多塊獨立的物理磁盤按不同的raid級別組合起形成一個磁盤組,在邏輯上看是一塊大的磁盤,可以提供比單個物理磁盤更大的存儲容量或更高的存儲性能,同時又能提供不同級別數據冗余備份的一種技術。
用RAID最直接的好處是:
-
提升數據安全性
-
提升數據讀寫性能
-
提供更大的單一邏輯磁盤數據容量存儲
1.2.實現模式
-
軟件磁盤陣列(software RAID),主要由電腦主板CPU處理數組存儲作業,缺點為耗損較多CPU資源運算RAID,優點是價格低。
-
硬件磁盤陣列(Hardware RAID),RAID卡上內置處理器,不需要服務器的CPU運算。優點是讀寫性能最快,不占用服務器資源,可以用於任何操作系統,缺點是其售價很高,但在企業生產環境首選硬RAID解決方案。
DELL服務器,默認就會支持RAID0,1,如果RAID5,10就需要買raid卡了。
1.3 raid與LVM區別
LVM是在硬盤的硬盤分區上又創建一個邏輯層,以方便系統管理硬盤分區系統。
區別:
LVM:靈活的管理磁盤的容量,有一定的冗余和性能功能,但很弱。
RAID:更側重性能和數據安全。
1.4 RAID級別間優缺點對比
運維生產環境常用RAID級別為RAID0,RAID1, RAID5 ,RAID10
| RAID級別 |
最少磁盤要求 |
關鍵優點 |
關鍵缺點 |
實際應用場景 |
| RAID0 |
1塊 |
讀寫速度快 |
沒有任何冗余 |
MySQL Slave(數據庫的從庫),集群的節點RS |
| RAID1 |
2塊(只能) |
100%冗余,鏡像 |
讀寫性能一般,成本高 |
單獨的,數據很重要,且不能宕機的業務,監控,系統盤 |
| RAID5 |
3塊 |
具有一定性能和冗余,可以壞一塊盤 |
寫入性能不高 |
一般的業務都可以用 |
| RAID10 |
4塊 |
讀寫速度很快,100%冗余 |
成本高 |
性能和冗余要求很好的業務。數據庫主庫和存儲的主節點。 |
2.1 raid 0介紹
RAID 0 又稱為Stripe(條帶化)或striping(條帶模式),它在所有RAID級別中具有最高的存儲性能(磁盤容量不浪費,讀寫很快)。
RAID0 提高存儲性能的原理是把連續的數據分散到多個磁盤上存取,這樣,系統有數據請求就可以被多個磁盤並行的執行,每個磁盤執行屬於它自己的那部分數據請求,這種數據上的並行操作可以充分利用總線的帶寬,顯著提高磁盤整體存取性能。
要制作RAID0至少要1塊物理磁盤,例如DELL服務器帶有RAID卡,如果不做RAID就不能使用磁盤,除非將磁盤直接接入主板,因此將一塊磁盤坐RAID0使用。
2.2 raid0 特點
| 關注點 |
描述 |
| 容量 |
是5塊盤加在一起的容量。在所有RAID級別中具有最高的存儲性能,原理是把連續的數據分散到多個磁盤上存取。 |
| 性能 |
理論上磁盤讀寫速度比單盤提升5倍,但由於總線帶寬等多種因素的影響,實際的提升速率肯定會低於理論值,但是,大量數據並行傳輸與串行傳輸比較,提速效果顯然毋庸置疑,磁盤越多倍數越小。 |
| 冗余 |
無任何冗余,壞1塊盤,整個RAID就不能用了 |
| 場合 |
適合於大規模並發讀寫,但對數據安全性要求不高的情況,如mysql slave(數據塊從庫),集群的節點RS(服務員) |
| 特點 |
速度快,無冗余,容量無損失 |
3.1RAID 1 介紹
RAID 1 又稱為Mirror 或Mirrooring(鏡像),它的宗旨是最大限度的保證用戶數據的可用性和可修復性,RAID 1 的操作方式是把用戶寫入硬盤的數據百分之百的自動復制到另外一個硬盤上,從而實現存儲雙份的數據。
要制作RAID 1,只支持兩塊盤,整個RAID大小等於兩個磁盤中最小的那塊的容量,因此,最好使用同樣大小的磁盤,在存儲時同時寫入兩塊磁盤,實現數據完整備份,但相對降低了寫入性能,但是讀取數據時可以並發,相當於兩塊RAID 0的讀取效率。
| 關注點 |
描述 |
| 容量 |
損失50%的數據容量,列如2塊1T的盤,做完RAID1后容量為1T |
| 性能 |
Mirror不能提高存儲性能,理論上寫性能和單盤差不多。 |
| 冗余 |
在所有RAID級別中,RAID1提供最高的數據安全保障,冗余度100% |
| 特點 |
100%冗余,容量損失半。 |
4.1 RAID 5介紹
RAID 是一種存儲性能,數據安全和存儲成本兼顧的存儲解決方案。
RAID 5需要三塊或以上的物理磁盤,可以提供熱備盤實現故障恢復,采用奇偶校驗,可靠性強,只有同時損壞2塊盤時數據才會損壞,只損壞1塊盤時,系統會根據存儲的奇偶校驗位重建數據,臨時提供服務,此時如果有熱備盤,系統還會自動在熱備盤上重建故障磁盤上的數據。
數據存儲方式如圖所示DP為D1,D2,D3的奇偶校驗信息,其他以此類推,由圖看出,RAID5 不對存儲的數據進行備份,而是把數據和相對應的奇偶校驗信息存儲到組成的RAID5的各個磁盤上,並且奇偶校驗信息和相對應的數據分布存儲於不同的磁盤上,當RAID5的一個磁盤數據發生損壞后,利用剩下的數據和相應的奇偶校驗信息區恢復被損壞的數據。
| 關注點 |
描述 |
| 性能 |
RAID 5 具有和RAID 0 相近的數據讀取速度,只是多了奇偶校驗信息,寫入數據速度比單個磁盤寫入操作稍慢。 |
| 容量 |
損失一塊盤的數據容量10*600G 9*600G |
| 冗余 |
可損失一塊盤,RAID數據安全保障程度比RAID 1 低而磁盤空間利用率要比raid 1 高 |
| 場合 |
RAID 5 可以理解為是RAID 0 和RAID 1的折中方案,適合對性能和冗余都有一定要求,又都不是十分高的情況。 mysql的主從庫都可以,存儲也可以,普通的服務器為了減少維護成本,又保持一定冗余和讀性能都可以做RAID 5 |
| 特點 |
容量損失一塊盤,寫數據通過奇偶校驗,RAID 1和 RAID 0的折中方案。 |
5.1 raid10介紹
RAID 1+0 也被稱為RAID 10標准,實際是將RAID 1和RAID 0標准結合的產物,在連續地以位或字節為單位分割數據並且並行讀/寫多個磁盤的同時,為每一塊磁盤作磁盤鏡像進行冗余。它的優點是同時擁有RAID 0的超凡速度和RAID 1的數據高可靠性,但是CPU占用率同樣也更高,而且磁盤的利用率比較低。
極高的讀寫效率和較高的數據保護、恢復能力
注意一下Raid 10 和 Raid01的區別:
RAID01又稱為RAID0+1,先進行條帶存放(RAID0),再進行鏡像(RAID1)。
RAID10又稱為RAID1+0,先進行鏡像(RAID1),再進行條帶存放(RAID0)。
| 關注點 |
描述 |
| 性能 |
極高的讀寫效率和較高的數據保護、恢復能力 |
| 冗余 |
RAID10提供100%的數據冗余 |
| 應用場合 |
RAID 10適用於數據庫存儲服務器等需要高性能、高容錯但對容量要求不大的場合 |
| 特點 |
RAID 1和RAID 0標准結合的產物 |



