Nginx基礎
學習完了nginx的一些基礎知識,寫篇博客做個筆記,方便以后復習,本篇博客在晚上精神不佳是所寫,可能會有拼寫錯誤,
對于服務端大佬如果看到這篇想解決問題,請出門右轉,因為太基礎我還是一個nginx初學者,如果大佬愿意看我的這篇文章,我再辭抱拳感謝,也十分歡迎看到這篇文章的人給我這個nginx初學者提出寶貴的建議,十分感謝!!(▽)
nginx的中間架構

多路復用
多個描述符的io操作都能在一個執行緒內完成并發的交替的順序完成,這就叫io多路復用,這里的‘復用’指的是復用同一個執行緒
什么是select

缺點:能夠監視的檔案描述符的數量存在最大限制,線性掃描效率低下
epoll模型
每當FD就緒,采用系統的回呼函式之間將fd放入,效率更高,最大連接無限制
nginx十分輕量級,代碼模塊化,功能模塊少,與cpu親和

為什么要與cpu親和?

cpu親和就是一種把cpu核心和nginx作業行程系結的方式,把每個worker行程固定在一個cpu上執行,減少切換cpu的cache miss,獲得更好的性能
nginx的sendfile


初學nginx,對許多概念都還不理解,反正nginx很好就對了,雖然以前沒apache牛X,但現在應該趕得上apache了
搭建環境
nginx具體介紹:Nginx是一款輕量級的HTTP服務器,采用事件驅動的異步非阻塞處理方式框架,這讓其具有極好的IO性能,時常用于服務端的反向代理和負載均衡
優點:
- 支持海量高并發:采用IO多路復用epoll,官方測驗Nginx能夠支持5萬并發鏈接,實際生產環境中可以支撐2-4萬并發連接數,
- 記憶體消耗少:在主流的服務器中Nginx目前是記憶體消耗最小的了,比如我們用Nginx+PHP,在3萬并發鏈接下,開啟10個Nginx行程消耗150M記憶體,
- 免費使用可以商業化:Nginx為開源軟體,采用的是2-clause BSD-like協議,可以免費使用,并且可以用于商業,
- 組態檔簡單:網路和程式配置通俗易懂,即使非專業運維也能看懂,
emmm...,其實也不算是初學,不然怎么會有現成的環境,以前感興趣自己打了個環境,沒了個域名和服務器,只不過當時知識簡單了解了了解,這次我是要比上次學的更加深刻了
環境搭建很簡單,下載nginx,一般的規矩:學習最新版,上線穩定版,我的整個學習完全是基于centos,所以命令少不了,先回憶一下搭建基礎環境的命令
檢查yum源:yum list | grep nginx,作用是檢查當前版本的作業系統nginx的版本
nginx是c寫的所以一定少不了gccyum -y install gcc gcc-c++ autoconf pcre-devel make automake
然后既然是在linux上操作,編輯器怎么能缺了vimyum -y install wget httpd-tools vim
最后一切就緒,點火:yum install nginx
如果當前linux上yum源的nginx版本比較低,想安裝高版本,可以進行以下操作:
配置yum源:使用官網上的源
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1
復制上面的代碼并執行vim /etc/yum.repos.d/nginx.repo
把代碼粘貼進去,然后修改作業系統和版本號
檢查是否安裝成功nginx -v,小v看版本,大v看編譯引數
安裝目錄
晚上打字,眼有些花,難免會打錯,尤其是路徑和命令,要與實際目錄相對比
查看安裝目錄rpm -ql nginx,通過這條命令,可以nginx每個檔案安裝在哪
/etc/logrotate.d/nginx組態檔,nginx日志輪轉,用于logrotate服務的日志切割(其實這里我學的時候并不明白,???)
/etc/nginx/nginx.conf和/etc/nginx/nginx.conf.default是主要的組態檔,也是學習nginx的關鍵檔案
/etc/nginx/fastcgi_params,/etc/nginx/uwsgi_params,/etc/nginx/scgi_params,組態檔,與cgi配置相關,fastcgi配置
/etc/nginx/koi-utf,/etc/nginx/koi-win,/etc/nginx/win-utf,組態檔,編碼轉化映射轉化檔案
/etc/nginx/mime.types,組態檔,設定http協議的content-type與拓展名對應關系
/usr/lib/systemd/system/nginx/nginx-debug.service,/usr/lib/systemd/system/nginx.service,/etc/sysconfig/nginx,/etc/sysconfig/nginx,/etc/sysconfig/nginx-debug,組態檔,用于配置出系統守護行程管理器管理方式
/usr/lib64/nginx/modules,/etc/nginx/modules,目錄,nginx模塊目錄
/usr/sbin/nginx,/usr/sbin/nginx-debug,,命令,nginx服務的啟動管理的終端的管理命令
/usr/share/doc/nginx-1.16.1,/usr/share/doc/nginx-1.16.1/COPYRIGHT,檔案,目錄,nginx的手冊和幫助
/var/cache/nginx,目錄,nginx快取目錄
/var/log/nginx,目錄,nginx的日志目錄
編譯引數
執行nginx -V,可查看編譯引數,注意是大寫的V
我這里的編譯引數是這樣的
nginx version: nginx/1.16.1
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/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-stream_ssl_preread_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
不同版本的結果略有區別,我這安裝和編譯均是在2020年初進行的
幾張截圖大致了解一下重要的內容





請求回應
linux命令列的瀏覽器:curl http://baidu.com,回傳的是html內容,如果想看請求回應的相關內容,執行curl -v http://baidu.com >dev/null,然后可看見請求回應這一程序的一系列資訊,當然如果是圖形界面可以在控制臺看見
日志型別
包括:error.log,access_log

執行tail -f /var/log/nginx/error.log查看error.log
執行tail -n 200 /var/log/nginx/access.log,查看access.log,數字代表行數
nginx變數
http請求變數 -arg_PARAMETER,http_HEADER,send_http_HEADER
內置變數 -nginx內置的變數
自定義變數 -自己定義的變數
在nginx.conf里,我這在nginx.conf.default里配置不管用,不知為何,包括下面的只要配置引數基本都在nginx.conf里,網上大部分教程都是在nginx.conf.default里,我這就是不管用
http {
log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
這里第一個對于main級別的錯誤會按照這樣的處理,其中開始的'$http_user_agent'是添加的http請求變數
執行nginx -t -c /etc/nginx/nginx.conf檢查nginx.conf是否有語法錯誤
執行nginx -s reload -c /etc/nginx/nginx.conf重加載改動的檔案,也可以對nginx進行重啟,這樣才能生效
提供兩個命令nginx -s quit和nginx
執行ps -aux | grep nginx,查看nginx是否啟動
nginx模塊
分官方模塊和第三方模塊,通過nginx -V,可大致查看,--with一類的模塊是重點
--with-http_sub_status_module,nginx客戶端狀態

location /mystatus {
stub_status;
}
測驗是否有語法錯誤nginx -tc /etc/nginx/nginx.conf
在瀏覽器訪問(本地主機)ip/mystatu,就會出現效果
--with-http_random_index_module,目錄中隨機選擇主頁

重啟nginx還可以這樣systemctl reload nginx,不過我更喜歡前面介紹過的方法
location里加一句random_index on;,即可實作
--with-http_sub_module,http內容替換



sub_filter 'bbbbbbbbb' 'BBBBBB';
sub_filter_once off;# 全部替換
請求限制
鏈接頻率限制 -limit_conn_module
請求頻率限制-limit_req_module


tcp復用:http請求建立在一次tcp基礎連接上與一次tcp請求至少產生一次http請求


測驗這一塊可用命令ab -n 50 -c 20 ip/..做壓力測驗
引數說明:
-n :請求總次數
-c:并發數
-k:是否開啟長連接
-s:超時設定
訪問控制
基于ip訪問:-http_access_module
基于用戶的信任登錄: -http_auth_basic_module


location ~ ^/admin.html {
# root html;
# deny 223.90.1.245;
# allow all;
# index 1.html 2.html index.html;
}
http_access_module局限性用一張圖即可說明

只能通過$remote_addr控制信任
http_x_forwarded_for

http_x_forword_for=Client IP, Proxy(1) IP, Proxy(2) IP,...
解決http_access_module局限性
方法一:采用別的http頭資訊控制訪問,如:HTTP_x_FORWARD_FOR
方法二:結合geo模塊
方法三:通過http自定義變數傳遞
http_auth_basic_module

需要用到htpasswd,所以需要安裝yum install httpd-tools -y
執行以下命令htpasswd -c ./auth_conf xxx,然后輸入密碼,確認密碼
將生成的auth.conf放置到nginx目錄下
對nginx.conf進行如下配置
location ~ ^/admin.html {
auth_basic "Auth acess test! input your password!";
auth_basic_user_file /etc/nginx/auth_conf;
}
然后訪問頁面就需要輸入剛剛配置的用戶名和密碼
http_auth_basic_module局限性
1.用戶資訊依賴檔案方式
2.操作管理機械,效率低下
解決方案
1.nginx結合LUA實作高效驗證
2.nginx和LDAP打通,利用nginx-auth-ldap模塊(好吧,我承認目前還不知道這些,以后才能知道)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/183099.html
標籤:其他
上一篇:nginx基礎
下一篇:IT培訓機構那些不得不說的事兒
