目錄
- 一.關于nginx
- 二.nginx的安裝方式
- 三.原始碼編譯安裝nginx
- 3.1 下載nginx原始碼并解壓
- 3.2 創建nginx用戶和組
- 3.3 安裝nginx編譯環境(解決依賴問題)
- 3.4 檢查系統環境
- 3.5 編譯nginx
- 3.6 編譯安裝nginx
- 3.7 啟動nginx
- 3.8 nginx目錄功能介紹:
- 四.設定nginx開機自啟動
- 五.測驗nginx功能是否正常
- 六.開放防火墻里的80埠
- 七.nginx日志切割
- 八.給nginx主行程發送信號進行nginx的停止,升級,日志切割
- 九.nginx常用命令
- 十.nginx組態檔詳解
- 十一.nginx性能調優
- 十二.nginx常見問題解決思路
- 12.1 普通用戶啟動,重啟,重新加載nginx的時候報錯:
- 十三.向已安裝的nginx添加新模塊
- 13.1 問題背景
- 13.2 向已經安裝的nginx添加新模塊
一.關于nginx
? nginx是由1994年畢業于俄羅斯國立莫斯科鮑曼科技大學的同學為俄羅斯rambler.ru公司開發的,開發作業最早從2002年開始,第一次
公開發布時間是2004年10月4日,版本號是0.1.0
Nginx是單行程單執行緒模型,即啟動的作業行程只有一個行程回應客戶端請求,不像apache可以在一個行程內啟動多個執行緒回應請求,
因此在記憶體占用上比apache小很多,Nginx維持一萬個非活動會話只要2.5M記憶體,Nginx和MySQL是CPU密集型的,就是對CPU的占用比
較大,默認session在本地檔案保存,支持將session保存在memcache,但是memcache默認支持最大1M的hash物件,
nginx的版本分為開發版、穩定版和過期版,nginx以功能豐富著稱,它即可以作為http服務器,也可以作為反向代理服務器或者郵件
服務器,能夠快速的回應靜態網頁的請求,支持FastCGI/SSL/Virtual Host/URL Rwrite/Gzip/HTTP Basic Auth等功能,并且支持第三方的
功能擴展,
二.nginx的安裝方式
? nginx安裝可以使用yum或原始碼安裝,推薦使用原始碼,一是yum的版本比較舊,二是使用原始碼可以自定義功能,方便業務的上的使用,
? 原始碼安裝需要提前準備標準的編譯器,GCC的全稱是(GNU Compiler collection),其由GNU開發,并以GPL即LGPL許可,是自由的
類UNIX即蘋果電腦Mac OS X作業系統的標準編譯器,因為GCC原本只能處理C語言,所以原名為GNU C語言編譯器,后來得到快速發
展,可以處理C++,Fortran,pascal,objective-C,Java以及Ada等其他語言,此外還需要Automake工具,以完成自動創建Makefile的工
作,Nginx的一些模塊需要依賴第三方庫,比如pcre(支持rewrite),zlib(支持gzip模塊)和openssl(支持ssl模塊),
三.原始碼編譯安裝nginx
3.1 下載nginx原始碼并解壓
[root@node5 ~]# wget http://nginx.org/download/nginx-1.19.3.tar.gz
[root@node5 ~]# ls nginx-1.19.3.tar.gz -lh
-rw-r--r-- 1 root root 1.1M Sep 29 22:39 nginx-1.19.3.tar.gz
[root@node5 ~]# tar xf nginx-1.19.3.tar.gz
[root@node5 ~]# cd nginx-1.19.3
[root@node5 nginx-1.19.3]# pwd
/root/nginx-1.19.3
[root@node5 nginx-1.19.3]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
3.2 創建nginx用戶和組
[root@node5 nginx]# groupadd nginx
[root@node5 nginx]# useradd -g nginx nginx
[root@node5 nginx]# id nginx
uid=8000(nginx) gid=8000(nginx) groups=8000(nginx)
[root@node5 nginx]# grep nginx /etc/passwd
nginx:x:8000:8000::/home/nginx:/bin/bash
#設定linux高負載引數,調整檔案描述符
[root@node5 nginx]# ulimit -SHn 65535
3.3 安裝nginx編譯環境(解決依賴問題)
nginx編譯需要的組件介紹:
? gcc為GNU Compiler Collection的縮寫,可以編譯C和C++源代碼等,它是GNU開發的C和C++以及其他很多種語言 的編譯器(最早的
時候只能編譯C,后來很快進化成一個編譯多種語言的集合,如Fortran、Pascal、Objective-C、Java、Ada、 Go等,)
? gcc 在編譯C++源代碼的階段,只能編譯 C++ 源檔案,而不能自動和 C++ 程式使用的庫鏈接(編譯程序分為編譯、鏈接兩個階段,注意
不要和可執行檔案這個概念搞混,相對可執行檔案來說有三個重要的概念:編譯(compile)、鏈接(link)、加載(load),源程式文
件被編譯成目標檔案,多個目標檔案連同庫被鏈接成一個最終的可執行檔案,可執行檔案被加載到記憶體中運行),因此,通常使用 g++ 命
令來完成 C++ 程式的編譯和連接,該程式會自動呼叫 gcc 實作編譯,
? gcc-c++也能編譯C源代碼,只不過把會把它當成C++源代碼,后綴為.c的,gcc把它當作是C程式,而g++當作是c++程式;后綴為.cpp
的,兩者都會認為是c++程式,注意,雖然c++是c的超集,但是兩者對語法的要求是有區別的,
? automake是一個從Makefile.am檔案自動生成Makefile.in的工具,為了生成Makefile.in,automake還需用到perl,由于automake創
建的發布完全遵循GNU標準,所以在創建中不需要perl,libtool是一款方便生成各種程式庫的工具,
? pcre pcre-devel:在Nginx編譯時,需要 PCRE(Perl Compatible Regular Expression),因為Nginx 的Rewrite模塊和HTTP 核心模塊會
使用到PCRE正則運算式語法,pcre-devel 是使用 pcre 開發的一個二次開發庫,
? zlip zlib-devel:zlib 庫提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內容進行 gzip ,所以需要在 Centos 上安裝
zlib 庫,nginx啟用壓縮功能的時候,需要此模塊的支持,
? openssl openssl-devel:OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的密鑰和證書封裝管理功能及 SSL
協議,并提供豐富的應用程式供測驗或其它目的使用,nginx 不僅支持 http 協議,還支持 https(即在ssl協議上傳輸http),開啟SSL的
時候需要此模塊的支持,
[root@node5 ~]# yum -y install gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openssl-devel
Loaded plugins: fastestmirror
......
Package 1:openssl-1.0.2k-19.el7.x86_64 already installed and latest version
Package 1:openssl-devel-1.0.2k-19.el7.x86_64 already installed and latest version
Nothing to do
3.4 檢查系統環境
? 檢查系統環境是否符合編譯安裝的要求,比如是否有gcc編譯工具,是否支持編譯引數當中的模塊,并根據開啟的引數等生成Makefile
檔案為下一步做準備:
[root@node5 nginx-1.19.3]# pwd
/root/nginx-1.19.3
[root@node5 nginx-1.19.3]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
[root@node5 nginx-1.19.3]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --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
checking for OS
+ Linux 3.10.0-693.el7.x86_64 x86_64
checking for C compiler ... found
......
nginx http uwsgi temporary files: "/var/tmp/nginx/uwsgi"
nginx http scgi temporary files: "/var/tmp/nginx/scgi"
#echo $?輸出為0,則上一步驟沒錯
[root@node5 nginx-1.19.3]# echo $?
0
3.5 編譯nginx
[root@node5 nginx-1.19.3]# make -j 4
[root@node5 nginx-1.19.3]# echo $?
0
3.6 編譯安裝nginx
[root@node5 nginx-1.19.3]# make install
[root@node5 nginx-1.19.3]# echo $?
0
3.7 啟動nginx
[root@node5 nginx-1.19.3]# cd /usr/local/nginx/
[root@node5 nginx]# ls
conf html sbin
[root@node5 nginx]# pwd
/usr/local/nginx
#查看nginx詳細版本資訊
[root@node5 nginx]# sbin/nginx -V
nginx version: nginx/1.19.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-te -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
#啟動nginx報錯,需要創建/var/tmp/nginx/client/目錄
[root@node5 nginx]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx: [emerg] mkdir() "/var/tmp/nginx/client/" failed (2: No such file or directory)
[root@node5 nginx]# su nginx
[nginx@node5 nginx]$ mkdir -p /var/tmp/nginx/client/
[nginx@node5 nginx]$ exit
exit
#再次啟動nginx
[root@node5 nginx]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#可以看到nginx啟動成功
#master process是nginx的主行程,只有一個主行程
#worker process是nginx作業行程,默認只有一個,可以通過修改nginx.conf中的worker_processes 1; 引數啟動多個作業行程
[root@node5 nginx]# ps -ef | grep nginx
root 14592 1 0 16:33 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 14593 14592 0 16:33 ? 00:00:00 nginx: worker process
root 14604 128012 0 16:33 pts/1 00:00:00 grep --color=auto nginx
#停止nginx
[root@node5 nginx]# /usr/local/nginx/sbin/nginx -s stop
[root@node5 nginx]# ps -ef | grep nginx
root 14765 128012 0 16:36 pts/1 00:00:00 grep --color=auto nginx
3.8 nginx目錄功能介紹:
- ? conf:保存nginx所有的組態檔,其中nginx.conf是nginx服務器的最核心最主要的組態檔,其他的.conf則是用來配置nginx相關的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params兩個檔案,組態檔一般都有個模板組態檔,是檔案名.default結尾,使用時復制一份,去掉default后綴即可,
- ? html目錄中保存了nginx服務器的web檔案,但是可以更改為其他目錄保存web檔案,另外還有一個50x的web檔案是默認的錯誤頁面提示頁面,
- ? logs:用來保存nginx服務器的訪問日志,錯誤日志等日志,logs目錄可以放在其他路徑,比如/var/logs/nginx里面,
- ? sbin:保存nginx二進制啟動腳本,可以接受不同的引數以實作不同的功能,
[root@node5 ~]# cd /usr/local/nginx/
[root@node5 nginx]# pwd
/usr/local/nginx
[root@node5 nginx]# ls
conf html sbin
[root@node5 nginx]# ls conf/
fastcgi.conf fastcgi_params koi-utf mime.types nginx.conf scgi_params uwsgi_params win-utf
fastcgi.conf.default fastcgi_params.default koi-win mime.types.default nginx.conf.default scgi_params.default uwsgi_params.default
[root@node5 nginx]# ls html/
50x.html index.html
[root@node5 nginx]# ls sbin/
nginx
[root@node5 nginx]# ls /var/log/nginx
access.log error.log
四.設定nginx開機自啟動
? 設定nginx開機自啟動,并使用systemctl管理,此步驟有兩種方法,任選一種即可
方法一:
#創建軟鏈接
[root@node5 nginx]# ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
[root@node5 nginx]# ll /usr/bin/nginx
lrwxrwxrwx 1 root root 27 Oct 22 16:43 /usr/bin/nginx -> /usr/local/nginx/sbin/nginx
[root@node5 nginx]# vim /etc/init.d/nginx
#/etc/init.d/nginx的內容如下
[root@node5 ~]# cat /etc/init.d/nginx
#!/bin/bash
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: NGINX is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
#lockfile=/var/lock/subsys/nginx
lockfile=/var/lock/nginx.lock
make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=https://www.cnblogs.com/renshengdezheli/p/`echo $opt | cut -d"=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
[root@node5 ~]#
#/etc/init.d/nginx給腳本賦予可執行權限
[root@node5 nginx]# chmod a+x /etc/init.d/nginx
[root@node5 nginx]# ll !$
ll /etc/init.d/nginx
-rwxr-xr-x 1 root root 2649 Oct 22 17:48 /etc/init.d/nginx
[root@node5 nginx]# chkconfig --add /etc/init.d/nginx
[root@node5 nginx]# chkconfig nginx on
#啟動nginx
[root@node5 nginx]# systemctl start nginx
#查看nginx啟動狀態
[root@node5 nginx]# ps -ef | grep nginx
root 18530 1 0 17:49 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 18531 18530 0 17:49 ? 00:00:00 nginx: worker process
root 18547 128012 0 17:50 pts/1 00:00:00 grep --color=auto nginx
#查看nginx啟動狀態
[root@node5 nginx]# systemctl status nginx
● nginx.service - SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled)
Active: active (running) since Thu 2020-10-22 17:49:55 CST; 1min 24s ago
Docs: man:systemd-sysv-generator(8)
Process: 18434 ExecStart=/etc/rc.d/init.d/nginx start (code=exited, status=0/SUCCESS)
Main PID: 18530 (nginx)
CGroup: /system.slice/nginx.service
├─18530 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
└─18531 nginx: worker process
Oct 22 17:49:55 node5 systemd[1]: Starting SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server...
Oct 22 17:49:55 node5 nginx[18434]: Starting nginx: [ OK ]
Oct 22 17:49:55 node5 systemd[1]: Started SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server.
#停止nginx
[root@node5 nginx]# systemctl stop nginx
[root@node5 nginx]# systemctl status nginx
● nginx.service - SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled)
Active: inactive (dead) since Thu 2020-10-22 17:51:29 CST; 4s ago
Docs: man:systemd-sysv-generator(8)
Process: 18623 ExecStop=/etc/rc.d/init.d/nginx stop (code=exited, status=0/SUCCESS)
Process: 18434 ExecStart=/etc/rc.d/init.d/nginx start (code=exited, status=0/SUCCESS)
Main PID: 18530 (code=exited, status=0/SUCCESS)
Oct 22 17:49:55 node5 systemd[1]: Starting SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server...
Oct 22 17:49:55 node5 nginx[18434]: Starting nginx: [ OK ]
Oct 22 17:49:55 node5 systemd[1]: Started SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server.
Oct 22 17:51:29 node5 systemd[1]: Stopping SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server...
Oct 22 17:51:29 node5 nginx[18623]: Stopping nginx: [ OK ]
Oct 22 17:51:29 node5 systemd[1]: Stopped SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server.
[root@node5 nginx]# ps -ef | grep nginx
root 18649 128012 0 17:51 pts/1 00:00:00 grep --color=auto nginx
方法二:
[root@node5 nginx]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP /var/run/nginx/nginx.pid
ExecStop=/bin/kill -s QUIT /var/run/nginx/nginx.pid
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#加入開機自啟動并啟動Nginx
[root@node5 nginx]# systemctl enable nginx.service
[root@node5 nginx]# systemctl restart nginx.service
五.測驗nginx功能是否正常
#能出現如下輸出則nginx成功啟動
[root@node5 nginx]# curl 192.168.110.184:80
<!DOCTYPE html>
<html>
<head>
......
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
直觀一點的話可以查看瀏覽器
六.開放防火墻里的80埠
如果防火墻啟動了的話,需要設定Firewalld防火墻,把80埠開放了
#啟動防火墻
[root@node5 nginx]# systemctl start firewalld
[root@node5 nginx]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2020-10-22 18:17:11 CST; 1s ago
Docs: man:firewalld(1)
Main PID: 20056 (firewalld)
CGroup: /system.slice/firewalld.service
└─20056 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Oct 22 18:17:11 node5 systemd[1]: Starting firewalld - dynamic firewall daemon...
Oct 22 18:17:11 node5 systemd[1]: Started firewalld - dynamic firewall daemon.
Oct 22 18:17:11 node5 firewalld[20056]: WARNING: ICMP type 'beyond-scope' is not supported by the kernel for ipv6.
Oct 22 18:17:12 node5 firewalld[20056]: WARNING: beyond-scope: INVALID_ICMPTYPE: No supported ICMP type., ignoring for run-time.
Oct 22 18:17:12 node5 firewalld[20056]: WARNING: ICMP type 'failed-policy' is not supported by the kernel for ipv6.
Oct 22 18:17:12 node5 firewalld[20056]: WARNING: failed-policy: INVALID_ICMPTYPE: No supported ICMP type., ignoring for run-time.
Oct 22 18:17:12 node5 firewalld[20056]: WARNING: ICMP type 'reject-route' is not supported by the kernel for ipv6.
Oct 22 18:17:12 node5 firewalld[20056]: WARNING: reject-route: INVALID_ICMPTYPE: No supported ICMP type., ignoring for run-time.
#把80埠開放
[root@node5 nginx]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@node5 nginx]# firewall-cmd --reload
success
[root@node5 nginx]# curl 192.168.110.184:80
如果完成防火墻設定以后,瀏覽器還能訪問nginx頁面,說明設定成功,
七.nginx日志切割
方法一:
1.nginx默認不會自動切割日志檔案,可以使用shell腳本配合crontab進行自動切割日志,
2.日志切割腳本中用到一個命令:kill -USR1 nginx的主行程號 ,該命令的作用是:向nginx主行程發送USR1信號,nginx主行程接到信號
后會從組態檔中讀取日志檔案名稱,重新打開日志檔案 (以組態檔中的日志名稱命名) ,并以作業行程的用戶作為日志檔案的所有者重
新打開日志檔案后,nginx主行程會關閉重名的日志檔案并通知作業行程使用新打開的日志檔案,作業行程立刻打開新的日志檔案并關閉
重名名的日志檔案,然后你就可以處理舊的日志檔案了,
3.撰寫日志切割腳本
#切割日志的腳本如下
[root@node5 ~]# cat nginx_log_rotate.sh
#!/bin/bash
#腳本執行,遇到錯就退出,不再往下執行
set -e
# 配合定時任務,0點過一秒再開始切割任務
sleep 1
#查詢nginx主行程號
PID=`cat /var/run/nginx/nginx.pid`
#獲得服務器昨天的時間
yesterday=$(date -d 'yesterday' +%Y-%m-%d)
#nginx的日志檔案目錄
ng_logs_dir='/var/log/nginx/'
#判斷nginx日志目錄是否存在,存在則進行日志切割
if [ -d $ng_logs_dir ];then
cd $ng_logs_dir
#通過 mv 命令將日志移動到分割后的日志,error日志一般不做切割
mv access.log access_${yesterday}.log
#發送 kill -USR1 信號給 Nginx 的主行程號,讓 Nginx 重新生成一個新的日志檔案
kill -USR1 $PID
sleep 1
#把舊的日志打成壓縮包
tar -czf access_${yesterday}.log.tar.gz access_${yesterday}.log
#已有壓縮包,洗掉壓縮前的日志
rm -f access_${yesterday}.log
else
echo "nginx日志目錄不存在,請檢查"
exit 0
fi
#賦予腳本可執行權限
[root@node5 ~]# chmod +x nginx_log_rotate.sh
[root@node5 ~]# ll nginx_log_rotate.sh
-rwxr-xr-x 1 root root 951 Oct 26 15:36 nginx_log_rotate.sh
[root@node5 ~]# ll -h /var/log/nginx/
-rw-r--r-- 1 nginx root 11K Oct 26 15:37 access.log
-rw-r--r-- 1 nginx root 554 Oct 22 17:51 error.log
#手動執行腳本查看效果
[root@node5 ~]# bash nginx_log_rotate.sh
[root@node5 ~]# ll -h /var/log/nginx/
-rw-r--r-- 1 root root 418 Oct 26 15:37 access_2020-10-25.log.tar.gz
-rw-r--r-- 1 nginx root 0 Oct 26 15:37 access.log
-rw-r--r-- 1 nginx root 554 Oct 22 17:51 error.log
4.設定crontab定時任務,每天凌晨執行腳本
[root@node5 ~]# crontab -e
[root@node5 ~]# crontab -l
0 0 * * * bash /root/nginx_log_rotate.sh
方法二:
#nginx日志切割腳本如下
[root@node5 ~]# cat logqiege.sh
#!/bin/bash
PID=`cat /var/run/nginx/nginx.pid`
mv /var/log/nginx/access.log /var/log/nginx/`date +%Y_%m_%d:%H:%M:%S`.access.log
kill -USR1 $PID
[root@node5 ~]# chmod +x logqiege.sh
[root@node5 ~]# ll -h /var/log/nginx/
total 20K
-rw-r--r-- 1 nginx root 14K Oct 26 15:58 access.log
-rw-r--r-- 1 nginx root 554 Oct 22 17:51 error.log
[root@node5 ~]# bash logqiege.sh
[root@node5 ~]# ll -h /var/log/nginx/
total 20K
-rw-r--r-- 1 nginx root 14K Oct 26 15:58 2020_10_26:15:58:38.access.log
-rw-r--r-- 1 nginx root 0 Oct 26 15:58 access.log
-rw-r--r-- 1 nginx root 554 Oct 22 17:51 error.log
[root@node5 ~]# crontab -e
[root@node5 ~]# crontab -l
*/1 * * * * bash /root/logqiege.sh
方法三:
1.高級用法–使用 nginx 本身來實作
當 nginx 在容器里,把 nginx 日志掛載出來的時候,我們發現就不適合再使用 kill -USR1 的方式去分割日志,這時候當然就需要從 nginx
本身配置去解決這個問題了,我們都知道訪問日志里面都有一個時間相關的欄位,如果我們把這個時間撈出來,這個問題就解決了
我們來看按天生成訪問日志
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
}
access_log /var/log/nginx/${year}_${month}_${day}_access.log json;
#或者腳本也可以這么寫
#切割日志
if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
set $tttt $1;
}
access_log /home/wwwlogs/access-$tttt.log ;
查看日志生成的結果

2.看到日志已經按照我們的需求切割出來了,這個的日志切割可以達到秒級,用法都是一樣的,去正則匹配到時間戳就好了,nginx 內置
的變數有很多,列如 ${server_name} 這些變數都是可以用來命名日志,當然如果我們需要壓縮,就寫個對應的定時任務去做壓縮就好了,
八.給nginx主行程發送信號進行nginx的停止,升級,日志切割
1.獲取nginx主行程號的辦法:
#獲取nginx主行程號的辦法:方法一
[root@node5 ~]# ps -ef | grep nginx
root 19806 1 0 Oct23 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 19807 19806 0 Oct23 ? 00:00:00 nginx: worker process
root 97457 77960 0 17:01 pts/7 00:00:00 grep --color=auto nginx
#獲取nginx主行程號的辦法:方法二:
#查看nginx的pid檔案,此檔案保存的就是nginx的主行程id,此ID是隨機的,每次啟動都不一樣的
[root@node5 ~]# cat /var/run/nginx/nginx.pid
19806
2.nginx支持的信號如下
#nginx支持的信號:
#平緩關閉Nginx,即不再接受新的請求,但是等當前請求處理完畢后再關閉Nginx,
[root@node5 ~]# kill -QUIT 19806
#快速停止Nginx服務
[root@node5 ~]# kill -TERM 19806
#使用新的組態檔啟動行程然后平緩停止原有的nginx行程,即平滑重啟,
[root@node5 ~]# kill -HUP 19806
#重新打開組態檔,用于nginx 日志切割,關于具體的日志切割技巧請查看“nginx日志切割”章節
[root@node5 ~]# kill -USR1 19806
#使用新版本的nginx檔案啟動服務,然后在平緩停止原有的nginx服務,即平滑升級,
[root@node5 ~]# kill -USR2 21703
#平滑停止nginx的作業行程,用于nginx平滑升級,
[root@node5 ~]# kill -WINCH 21703
#Nginx,-s采用向 Nginx發送信號的方式,-s signal:send signal to a master process: stop, quit, reopen, reload
#此方式停止步驟是待nginx行程處理任務完畢進行停止,
[root@node5 ~]# nginx -s quit
#此方式相當于先查出nginx行程id再使用kill命令強制殺掉行程,
[root@node5 ~]# nginx -s stop
九.nginx常用命令
下面列舉了nginx經常使用到的命令
#查看Nginx的版本號
[root@node5 ~]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.19.3
#查看Nginx的版本號和編譯引數
[root@node5 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.19.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --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
#啟動nginx:nginx安裝目錄地址 -c nginx組態檔地址
#-c后指定nginx的組態檔
[root@node5 ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#驗證nginx組態檔是否正確
[root@node5 ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#Nginx,-s采用向 Nginx發送信號的方式,-s signal:send signal to a master process: stop, quit, reopen, reload
#此方式停止步驟是待nginx行程處理任務完畢進行停止,
[root@node5 ~]# nginx -s quit
#此方式相當于先查出nginx行程id再使用kill命令強制殺掉行程,
[root@node5 ~]# nginx -s stop
#Nginx重新加載組態檔,-s采用向 Nginx發送信號的方式
nginx -s reload
#nginx停止操作是通過向nginx行程發送信號來進行的
#步驟1:查詢nginx主行程號
ps -ef | grep nginx
#在行程串列里 面找master行程,它的編號就是主行程號了,
#步驟2:發送信號
#從容停止Nginx:
kill -QUIT 主行程號
#快速停止Nginx:
kill -TERM 主行程號
#強制停止Nginx:
pkill -9 nginx
#若在nginx.conf配置了nginx.pid檔案存放路徑,則nginx.pid存放的就是Nginx主行程號,如果沒指定,則默認放在nginx的logs目錄下,有了nginx.pid檔案,我們就不用查詢Nginx的主行程號,再殺行程了,可以直接向Nginx發送信號了,
#命令如下:kill -信號型別 '/usr/nginx/logs/nginx.pid'
[root@node5 ~]# kill -9 /var/run/nginx/nginx.pid
# 啟動
systemctl start nginx
# 查看狀態
systemctl status nginx
# 停止
systemctl stop nginx
十.nginx組態檔詳解
1.nginx的主組態檔為nginx.conf,先看看nginx.conf的默認組態檔,#開頭的都是注釋,
#過濾組態檔中的注釋和空行
[root@node5 ~]# egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf
#nginx的啟動用戶/組
user nginx;
#啟動的作業行程數量,可以指定啟動的固定nginx行程數,或使用auto,auto是啟動與當前CPU執行緒相同的行程數,如CPU是四核八執行緒的就啟動八個行程的Nginx作業行程,
worker_processes 2;
#錯誤日志路徑
error_log /var/log/nginx/error.log;
error_log /var/log/nginx/error.log notice;
error_log /var/log/nginx/error.log info;
#Nginx的PID路徑
pid /var/run/nginx/nginx.pid;
#events模塊主要影響nginx服務器與用戶的網路連接,比如是否允許同時接受多個網路連接,使用哪種事件驅動模型處理請求,每個作業行程可以同時支持的最大連接數,是否開啟對多作業行程下的網路連接進行序列化等,
events {
#設定nginx可以接受的最大并發數
worker_connections 1024;
}
#http模塊是Nginx服務器配置中的重要部分,快取、代理和日志格式定義等絕大多數功能和第三方模塊都可以在這設定,http塊可以包含多個server塊,而一個server塊中又可以包含多個location塊,server塊可以組態檔引入、MIME-Type定義、日志自定義、是否啟用sendfile、連接超時時間和單個鏈接的請求上限等,
http {
#檔案擴展名與檔案型別映射表
include mime.types;
#默認檔案型別
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
#是否呼叫 sendfile 函式(zero copy -->零copy方式)來輸出檔案,普通應用打開,可以大幅提升nginx的讀檔案性能,如果服務器是下載的就需要關閉,
sendfile on;
#長連接超時時間,單位是秒
keepalive_timeout 65;
#server模塊,設定一個虛擬機主機,可以包含自己的全域快,同時也可以包含多個locating模塊,比如本虛擬機監聽的埠、本虛擬機的名稱和IP配置,多個server 可以使用一個埠,比如都使用80埠提供web服務,
server {
#server的全域配置,配置監聽的埠
listen 80;
#server的名稱,當訪問此名稱的時候,nginx會呼叫當前serevr內部的配置行程匹配,
server_name localhost;
#location其實是server的一個指令,為nginx服務器提供比較多而且靈活的指令,都是在location中體現的,主要是基于nginx接受到的請求字串,對用戶請求的URL進行匹配,并對特定的指令進行處理,包括地址重定向、資料快取和應答控制等功能都是在這部分實作,另外很多第三方模塊的配置也是在location模塊中配置,
location / {
#相當于默認頁面的目錄名稱,默認是相對路徑,可以使用絕對路徑配置,
root html;
index index.html index.htm;
}
#錯誤頁面的檔案名稱
error_page 500 502 503 504 /50x.html;
#location處理對應的不同錯誤碼的頁面定義到/50x.html,這個對應其server中定義的目錄下,
location = /50x.html {
#定義默認頁面所在的目錄
root html;
}
}
}
2.系結Nginx的作業行程到不同的CPU上,默認Nginx是不進行系結的,系結并不是當前nginx行程獨占一核心CPU,但是可以保證此行程不會運行在其他核心上,這就極大減少了nginx 作業行程在不同cpu上的跳轉,減少了CPU對行程的資源分配與回收,因此可以有效的提升nginx服務器的性能,配置如下:
#查看CPU的核心數量
[root@node5 ~]# grep process /proc/cpuinfo | wc -l
4
#四個執行緒CPU的配置:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
#八個執行緒CPU的配置:
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
3.nginx的PID檔案,錯誤日志檔案路徑,日志記錄級別相關配置:
#指定nginx的PID檔案路徑
pid logs/nginx.pid;
#指定錯誤日志路徑
error_log logs/error.log;
#指定日志記錄級別
error_log logs/error.log notice;
error_log logs/error.log info;
#nginx支持的日志級別:
#日志級別語法:
error_log file [ debug | info | notice | warn | error | crit ] | [{ debug_core | debug_alloc | debug_mutex | debug_event | debug_http | debug_mail | debug_mysql } ]
日志級別 = 錯誤日志級別 | 除錯日志級別; 或者
日志級別 = 錯誤日志級別;
#crit 記錄的日志最少,而debug記錄的日志最多,如果你的nginx遇到一些問題,比如502比較頻繁出現,但是看默認的error_log并沒有看到有意義的資訊,那么就可以調一下錯誤日志的級別,當你調成error級別時,錯誤日志記錄的內容會更加豐富,
#錯誤日志的級別: emerg, alert, crit, error, warn, notic, info, debug,
#除錯日志的級別: debug_core, debug_alloc, debug_mutex, debug_event, debug_http, debug_mail, debug_mysql
#error_log 指令的日志級別配置分為錯誤日志級別和除錯日志級別,錯誤日志只能設定一個級別,而且錯誤日志必須書寫在除錯日志級別的前面,另外除錯日志可以設定多個級別,其他配置方法可能無法滿足需求,
4.組態檔的引入:include
#file是要匯入的檔案,支持相對路徑,一般在html目錄里面
include file;
#例如:匯入一個conf檔案,并配置不同主機名的頁面,編輯nginx.conf主組態檔:
#在最后一個大括號里面加入一項,*是匯入任何以conf結尾的組態檔
include /usr/local/nginx/conf.d/samsung.conf;
#在/usr/local/nginx/conf.d/創建一個samsung.conf,內容如下:
[root@node5 ~]# grep -v "#" conf.d/samsung.conf | grep -v "^$"
server {
listen 8090;
server_name samsung.chinacloudapp.cn;
location / {
root html;
index index1.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
十一.nginx性能調優
1.主組態檔nginx.conf優化
#nginx的啟動用戶/組
user nginx nginx;
#nginx行程數,建議按照cpu數目來指定,一般為它的倍數,
worker_processes 8;
#為每個行程分配cpu,將8個行程分配到8個cpu,當然可以寫多個,或者將一個行程分配到多個cpu,
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
#這個指令是指一個nginx行程打開的最多檔案描述符數目,理論值應該是最多打開檔案數(ulimit -n)與nginx行程數相除,但是nginx分配請求并不是那么均勻,所以最好與ulimit -n的值保持一致,
#注:這里需要設定 ulimit -SHn 204800
worker_rlimit_nofile 204800;
events
{
#使用epoll的I/O模型
use epoll;
#每個行程允許的最多連接數,理論上每臺nginx服務器的最大連接數為worker_processes*worker_connections
worker_connections 204800;
}
http {
include mime.types;
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;
charset utf-8;
server_names_hash_bucket_size 128;
#客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設定,一般一個請求的頭部大小不會超過1k,不過由于一般系統分頁都要大于1k,所以這里設定為分頁大小,分頁大小可以用命令getconf PAGESIZE取得,
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 20m;
sendfile on;
tcp_nopush on;
#keepalive超時時間
keepalive_timeout 60;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
keys_zone=TEST:10m
inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#這個將為打開檔案指定快取,默認是沒有啟用的,max指定快取數量,建議和打開檔案數一致,inactive是指經過多長時間檔案沒被請求后洗掉快取,
open_file_cache max=204800 inactive=20s;
#open_file_cache指令中的inactive引數時間內檔案的最少使用次數,如果超過這個數字,檔案描述符一直是在快取中打開的,如上例,如果有一個檔案在inactive時間內一次沒被使用,它將被移除,
open_file_cache_min_uses 1;
#這個是指多長時間檢查一次快取的有效資訊,
open_file_cache_valid 30s;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
}
2.內核引數的優化
#備份初始內核引數
[root@node5 ~]# cp /etc/sysctl.conf /etc/sysctl.conf.bak
#清空內核引數
[root@node5 ~]# > /etc/sysctl.conf
#配置內核引數
[root@node5 ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
#開啟SYN Cookies,當出現SYN等待佇列溢位時,啟用cookies來處理,
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
#timewait的數量,默認是180000,
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
#每個網路介面接收資料包的速率比內核處理這些包的速率快時,允許送到佇列的資料包的最大數目,
net.core.netdev_max_backlog = 262144
#web應用中listen函式的backlog默認會給我們內核引數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認為511,所以有必要調整這個值,
net.core.somaxconn = 262144
#系統中最多有多少個TCP套接字不被關聯到任何一個用戶檔案句柄上,如果超過這個數字,孤兒連接將即刻被復位并列印出警告資訊,這個限制僅僅是為了防止簡單的DoS攻擊,不能過分依靠它或者人為地減小這個值,更應該增加這個值(如果增加了記憶體之后),
net.ipv4.tcp_max_orphans = 3276800
#記錄的那些尚未收到客戶端確認資訊的連接請求的最大值,對于有128M記憶體的系統而言,預設值是1024,小記憶體的系統則是128,
net.ipv4.tcp_max_syn_backlog = 262144
#時間戳可以避免序列號的卷繞,一個1Gbps的鏈路肯定會遇到以前用過的序列號,時間戳能夠讓內核接受這種“例外”的資料包,這里需要將其關掉,
net.ipv4.tcp_timestamps = 0
#為了打開對端的連接,內核需要發送一個SYN并附帶一個回應前面一個SYN的ACK,也就是所謂三次握手中的第二次握手,這個設定決定了內核放棄連接之前發送SYN+ACK包的數量,
net.ipv4.tcp_synack_retries = 1
#在內核放棄建立連接之前發送SYN包的數量,
net.ipv4.tcp_syn_retries = 1
#啟用timewait快速回收,
net.ipv4.tcp_tw_recycle = 1
#開啟重用,允許將TIME-WAIT sockets重新用于新的TCP連接,
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
#如果套接字由本端要求關閉,這個引數決定了它保持在FIN-WAIT-2狀態的時間,對端可以出錯并永遠不關閉連接,甚至意外當機,預設值是60秒,2.2 內核的通常值是180秒,你可以按這個設定,但要記住的是,即使你的機器是一個輕載的WEB服務器,也有因為大量的死套接字而記憶體溢位的風險,FIN- WAIT-2的危險性比FIN-WAIT-1要小,因為它最多只能吃掉1.5K記憶體,但是它們的生存期長些,
net.ipv4.tcp_fin_timeout = 1
#當keepalive起用的時候,TCP發送keepalive訊息的頻度,預設是2小時,
net.ipv4.tcp_keepalive_time = 30
#允許系統打開的埠范圍
net.ipv4.ip_local_port_range = 1024 65000
#保存內核引數
[root@node5 ~]# sysctl -p
3.FastCGI引數優化
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
這個指令為FastCGI快取指定一個路徑,目錄結構等級,關鍵字區域存盤時間和非活動洗掉時間,
fastcgi_connect_timeout 300;
指定連接到后端FastCGI的超時時間,
fastcgi_send_timeout 300;
向FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手后向FastCGI傳送請求的超時時間,
fastcgi_read_timeout 300;
接收FastCGI應答的超時時間,這個值是指已經完成兩次握手后接收FastCGI應答的超時時間,
fastcgi_buffer_size 16k;
指定讀取FastCGI應答第一部分需要用多大的緩沖區,這里可以設定為fastcgi_buffers指令指定的緩沖區大小,上面的指令指定它將使用1個16k的緩沖區去讀取應答的第一部分,即應答頭,其實這個應答頭一般情況下都很小(不會超過1k),但是你如果在fastcgi_buffers指令中指定了緩沖區的大小,那么它也會分配一個fastcgi_buffers指定的緩沖區大小去快取,
fastcgi_buffers 16 16k;
指定本地需要用多少和多大的緩沖區來緩沖FastCGI的應答,如上所示,如果一個php腳本所產生的頁面大小為256k,則會為其分配16個16k的緩沖區來快取,如果大于256k,增大于256k的部分會快取到fastcgi_temp指定的路徑中,當然這對服務器負載來說是不明智的方案,因為記憶體中處理資料速度要快于硬碟,通常這個值的設定應該選擇一個你的站點中的php腳本所產生的頁面大小的中間值,比如你的站點大部分腳本所產生的頁面大小為256k就可以把這個值設定為16 16k,或者4 64k 或者64 4k,但很顯然,后兩種并不是好的設定方法,因為如果產生的頁面只有32k,如果用4 64k它會分配1個64k的緩沖區去快取,而如果使用64 4k它會分配8個4k的緩沖區去快取,而如果使用16 16k則它會分配2個16k去快取頁面,這樣看起來似乎更加合理,
fastcgi_busy_buffers_size 32k;
這個指令我也不知道是做什么用,只知道默認值是fastcgi_buffers的兩倍,
fastcgi_temp_file_write_size 32k;
在寫入fastcgi_temp_path時將用多大的資料塊,默認值是fastcgi_buffers的兩倍,
fastcgi_cache TEST
開啟FastCGI快取并且為其制定一個名稱,個人感覺開啟快取非常有用,可以有效降低CPU負載,并且防止502錯誤,但是這個快取會引起很多問題,因為它快取的是動態頁面,具體使用還需根據自己的需求,
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
為指定的應答代碼指定快取時間,如上例中將200,302應答快取一小時,301應答快取1天,其他為1分鐘,
fastcgi_cache_min_uses 1;
快取在fastcgi_cache_path指令inactive引數值時間內的最少使用次數,如上例,如果在5分鐘內某檔案1次也沒有被使用,那么這個檔案將被移除,
fastcgi_cache_use_stale error timeout invalid_header http_500;
不知道這個引數的作用,猜想應該是讓nginx知道哪些型別的快取是沒用的, 以上為nginx中FastCGI相關引數,另外,FastCGI自身也有一些配置需要進行優化,如果你使用php-fpm來管理FastCGI,可以修改組態檔中的以下值:
<value name="max_children">60</value>
同時處理的并發請求數,即它將開啟最多60個子執行緒來處理并發連接,
<value name="rlimit_files">102400</value>
最多打開檔案數,
<value name="max_requests">204800</value>
每個行程在重置之前能夠執行的最多請求數,
十二.nginx常見問題解決思路
12.1 普通用戶啟動,重啟,重新加載nginx的時候報錯:
1.當我們使用普通用戶start,restart,reload nginx的時候出現如下錯誤:
nginx@node5 ~]$ /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /usr/local/nginx/conf/nginx.conf:1
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
2.出現這種問題的原因是:在Linux中1024以下的埠,只有root用戶才有權限占用,
3.解決方法:
方法一:設定只有root和nginx的啟動用戶才能啟動nginx(推薦)
#nginx用戶為nginx的啟動用戶
[nginx@node5 ~]$ id nginx
uid=8000(nginx) gid=8000(nginx) groups=8000(nginx)
#設定nginx目錄的所有者為root,組所有者為nginx
[root@node5 ~]# chown -R root:nginx /usr/local/nginx
[root@node5 ~]# ll /usr/local/nginx/ -d
drwxr-xr-x 5 root nginx 42 Oct 22 16:14 /usr/local/nginx/
[root@node5 ~]# chmod -R 750 /usr/local/nginx
#給可執行檔案nginx設定SUID權限,這樣nginx用戶啟動nginx的時候會臨時獲得root權限,關于SUID詳解請查看“檔案的特殊權限”章節
[root@node5 ~]# chmod u+s /usr/local/nginx/sbin/nginx
[root@node5 ~]# su nginx
[nginx@node5 root]$ /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#可以看到普通用戶也可以啟動nginx了
[nginx@node5 root]$ ps -ef | grep nginx
root 63296 61383 0 16:22 pts/0 00:00:00 su nginx
nginx 63297 63296 0 16:22 pts/0 00:00:00 bash
root 63345 1 0 16:23 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 63346 63345 0 16:23 ? 00:00:00 nginx: worker process
nginx 63347 63345 0 16:23 ? 00:00:00 nginx: worker process
nginx 63385 63297 0 16:24 pts/0 00:00:00 ps -ef
nginx 63386 63297 0 16:24 pts/0 00:00:00 grep --color=auto nginx
[nginx@node5 root]$ /usr/local/nginx/sbin/nginx -s quit
[nginx@node5 root]$ ps -ef | grep nginx
root 63296 61383 0 16:22 pts/0 00:00:00 su nginx
nginx 63297 63296 0 16:22 pts/0 00:00:00 bash
nginx 63470 63297 0 16:25 pts/0 00:00:00 ps -ef
nginx 63471 63297 0 16:25 pts/0 00:00:00 grep --color=auto nginx
方法二:設定所有用戶都可以啟動nginx(不推薦)
[root@node5 ~]# chown -R root:root /usr/local/nginx
[root@node5 ~]# chmod -R 755 /usr/local/nginx
[root@node5 ~]# chmod u+s /usr/local/nginx/sbin/nginx
方法三:使用sudo管理員權限啟動nginx,要執行此方法,必須保證nginx用戶具有sudo權限,關于sudo權限配置詳情,請查看“為普通用戶配置sudo權限”章節
[nginx@node5 ~]$ sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
[nginx@node5 ~]$ ps -ef | grep nginx
root 111427 94811 0 15:46 pts/1 00:00:00 su - nginx
nginx 111428 111427 0 15:46 pts/1 00:00:00 -bash
root 111628 1 0 15:49 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 111629 111628 0 15:49 ? 00:00:00 nginx: worker process
nginx 111630 111628 0 15:49 ? 00:00:00 nginx: worker process
nginx 111637 111428 0 15:49 pts/1 00:00:00 ps -ef
nginx 111638 111428 0 15:49 pts/1 00:00:00 grep --color=auto nginx
十三.向已安裝的nginx添加新模塊
13.1 問題背景
? 一般來說,我們會按照專案需求和業務需求按需編譯nginx,但是隨著時間的推移,nginx已有的模塊可能已經不能滿足現有業務需求
了,此時就需要向nginx動態添加新模塊,以滿足需求,
13.2 向已經安裝的nginx添加新模塊
1.進行此步驟的前提條件:之前已經編譯安裝過nginx,并且現在正在運行,
2.向已安裝的nginx添加新模塊的思路:使用與現有nginx相同版本的原始碼包,添加新模塊重新編譯nginx原始碼,然后把編譯好的nginx可執
行檔案替換現有的nginx可執行檔案,
3.nginx添加新模塊的命令格式:
./configure 引數 --add-module=新模塊
4.向已安裝的nginx添加新模塊,本次以添加ngx_http_google_filter_module模塊為例,ngx_http_google_filter_module是一個過濾器模
塊,能夠讓谷歌鏡像更便捷的部署,內建了正則運算式、URI locations和其他復雜的配置,原生nginx模塊確保了更加高效地處理
cookies, gstatic scoures和重定向,
#使用Git下載ngx_http_google_filter_module模塊
[root@node5 ~]# git clone https://github.com/cuber/ngx_http_google_filter_module
[root@node5 ~]# git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module
#查看nginx的版本號和詳細編譯引數
[root@node5 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.19.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --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
#解壓和現有版本一模一樣的nginx原始碼包
[root@node5 ~]# tar xf nginx-1.19.3.tar.gz
[root@node5 ~]# cd nginx-1.19.3
[root@node5 nginx-1.19.3]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
[root@node5 nginx-1.19.3]# pwd
/root/nginx-1.19.3
#清除上次的make命令所產生的object和Makefile檔案,使用場景:當需要重新執行configure時,需要執行make clean
[root@node5 nginx-1.19.3]# make clean
rm -rf Makefile objs
#檢查編譯環境,
[root@node5 nginx-1.19.3]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --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 --add-module=/root/ngx_http_google_filter_module --add-module=/root/ngx_http_substitutions_filter_module
#輸出為0,說明上一步成功
[root@node5 nginx-1.19.3]# echo $?
0
#編譯
[root@node5 nginx-1.19.3]# make -j 4
#輸出為0,說明上一步成功
[root@node5 nginx-1.19.3]# echo $?
0
#備份原有nginx可執行檔案
[root@node5 nginx-1.19.3]# mv /usr/local/nginx/sbin/nginx{,`date +%F-%T`}
[root@node5 nginx-1.19.3]# ll objs/nginx
-rwxr-xr-x 1 root root 6370448 Oct 30 16:55 objs/nginx
#使用新的nginx可執行檔案
[root@node5 nginx-1.19.3]# cp objs/nginx /usr/local/nginx/sbin/
#nginx -t查看組態檔是否正確
[root@node5 nginx-1.19.3]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#查看nginx的版本號和詳細編譯引數,由輸出可知,新模塊已經添加進去了
[root@node5 nginx-1.19.3]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.19.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --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 --add-module=/root/ngx_http_google_filter_module --add-module=/root/ngx_http_substitutions_filter_module
[root@node5 nginx-1.19.3]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
[root@node5 nginx-1.19.3]# ps -ef | grep nginx
root 36630 1 0 17:03 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 36631 36630 0 17:03 ? 00:00:00 nginx: worker process
nginx 36632 36630 0 17:03 ? 00:00:00 nginx: worker process
root 36641 27402 0 17:03 pts/2 00:00:00 grep --color=auto nginx
#curl nginx埠,輸入如下說明nginx功能正常
[root@node5 nginx-1.19.3]# curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
參考鏈接:
https://www.cnblogs.com/stulzq/p/9291223.html
https://www.jiangexing.cn/355.html
https://blog.csdn.net/lxw1844912514/article/details/104738967/
https://www.linuxidc.com/Linux/2017-02/140495.htm
https://www.linuxidc.com/Linux/2013-09/89656.htm
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/209533.html
標籤:Linux
