淺析nginx的安裝與使用(收藏)

之前的文章《深入淺出了解linuxmacos終端大小寫(xiě)敏感問(wèn)題(附代碼)》中,給大家了解了Linux和MacOS終端大小寫(xiě)敏感問(wèn)題。下面本篇文章給大家了解nginx安裝和使用,小伙伴們收藏好哦~

淺析nginx的安裝與使用(收藏)

Nginx安裝使用

for RHEL/centos

$?sudo?yum?install?yum-utils?-y  #手動(dòng)寫(xiě)入rpm源 #?在??/etc/yum.repos.d/nginx.repo?寫(xiě)入如下內(nèi)容  [nginx-stable] name=nginx?stable?repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key  [nginx-mainline] name=nginx?mainline?repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key  $?sudo?yum-config-manager?--enable?nginx-mainline $?sudo?yum?install?nginx?-y

其他平臺(tái)直接訪問(wèn)http://nginx.org/en/linux_packages.html#stable

nginx.pid失敗問(wèn)題執(zhí)行sudo nginx -c/usr/local/etc/nginx/nginx.conf sudo nginx-sreload#重啟sudo nginx -t#測(cè)試配置文件

nginx反向代理

server?{ ????listen???????80?default_server; ????listen???????[::]:80?default_server; ????server_name??chuchur.com?www.chuchur.com; ????#/rest/?開(kāi)頭的轉(zhuǎn)到7002 ????location?/rest/?{ ????????proxy_pass?http://127.0.0.1:7002/; ????????proxy_redirect??off; ????????proxy_set_header????????HOST??$host; ????????proxy_set_header????????X-Real-IP???????$remote_addr; ????????proxy_set_header????????X-Forwarded-For?$proxy_add_x_forwarded_for; ????????proxy_send_timeout??????300; ????????proxy_read_timeout??????300; ????}  ????#其他的轉(zhuǎn)發(fā)到7001 ????location?/?{ ????????proxy_pass?http://127.0.0.1:7001; ????????proxy_redirect??off; ????????proxy_set_header????????HOST??$host; ????????proxy_set_header????????X-Real-IP???????$remote_addr; ????????proxy_set_header????????X-Forwarded-For?$proxy_add_x_forwarded_for; ????????proxy_send_timeout??????300; ????????proxy_read_timeout??????300; ????} }

nginx負(fù)載均衡

#gzip?on upstream?node_server{ ????server?192.168.0.1:8001?weight=10; ????server?192.168.0.2:8001?weight=20; }  server{ ????listen?80; ????server_name?localhost;  ????location?/{ ????????proxy_pass?http://node_server; ????????root?html; ????????index?index.html?index.htm; ????} }

nignx緩存

#?1.?配置?http ##cache## proxy_connect_timeout?500; #跟后端服務(wù)器連接的超時(shí)時(shí)間_發(fā)起握手等候響應(yīng)超時(shí)時(shí)間 proxy_read_timeout?600; #連接成功后_等候后端服務(wù)器響應(yīng)的時(shí)間_其實(shí)已經(jīng)進(jìn)入后端的排隊(duì)之中等候處理 proxy_send_timeout?500; #后端服務(wù)器數(shù)據(jù)回傳時(shí)間_就是在規(guī)定時(shí)間內(nèi)后端服務(wù)器必須傳完所有數(shù)據(jù) proxy_buffer_size?128k; #代理請(qǐng)求緩存區(qū)_這個(gè)緩存區(qū)間會(huì)保存用戶的頭信息以供Nginx進(jìn)行規(guī)則處理_一般只要能保存下頭信息即可 proxy_buffers?4?128k; #同上?告訴Nginx保存單個(gè)用的幾個(gè)Buffer最大用多大空間 proxy_busy_buffers_size?256k; #如果系統(tǒng)很忙的時(shí)候可以申請(qǐng)更大的proxy_buffers?官方推薦*2 proxy_temp_file_write_size?128k; #proxy緩存臨時(shí)文件的大小 proxy_temp_path?/usr/local/nginx/temp; #用于指定本地目錄來(lái)緩沖較大的代理請(qǐng)求 proxy_cache_path?/usr/local/nginx/cache?levels=1:2?keys_zone=cache_one:200m?inactive=1d?max_size=30g; #設(shè)置web緩存區(qū)名為cache_one,內(nèi)存緩存空間大小為200M,自動(dòng)清除超過(guò)1天沒(méi)有被訪問(wèn)過(guò)的緩存數(shù)據(jù),硬盤(pán)緩存空間大小30g include?/etc/nginx/conf.d/*.conf;  #?2.location上添加緩存 #靜態(tài)數(shù)據(jù)保存時(shí)效 location?~?.html$?{ ??????proxy_pass?https://www.chuchur.com; ??????proxy_redirect?off; ??????proxy_cache?cache_one; ??????#此處的cache_one必須于上一步配置的緩存區(qū)域名稱相同 ??????proxy_cache_valid?200?304?12h; ??????proxy_cache_valid?301?302?1d; ??????proxy_cache_valid?any?1m; ??????#不同的請(qǐng)求設(shè)置不同的緩存時(shí)效 ??????proxy_cache_key?$uri$is_args$args; ??????#生產(chǎn)緩存文件的key,通過(guò)4個(gè)string變量結(jié)合生成 ??????expires?30d; ??????#其余類型的緩存時(shí)效為30天 ??????proxy_set_header?X-Forwarded-Proto?$scheme; }   #圖片等資源緩存30天 location?~?.(gif|jpg|jpeg|png|bmp|ico)$?{ ????root?/var/www/img/; ????expires?30d;?#支持?時(shí)(h)分(s)秒(m) } #視頻媒體資源永久緩存 location?~?.(wma|wmv|asf|mp3|mmf|zip|rar|swf|flv)$?{ ????root?/var/www/upload/; ????expires?max;  ????#禁止緩存,每次都從服務(wù)器請(qǐng)求 ????#add_header?Cache-Control?no-store; }

此處需要注意 3 點(diǎn):

  • 1、只有在proxy_pass的時(shí)候,才會(huì)生成緩存,下一次請(qǐng)求執(zhí)行到proxy_pass的時(shí)候會(huì)判斷是否有緩存,如果有則直接讀緩存,返回給客戶端,不會(huì)執(zhí)行proxy_pass;如果沒(méi)有,則執(zhí)行proxy_pass,并按照規(guī)則生成緩存文件;可以到nginx的cache文件夾下看是否生成了緩存文件。

  • 2、proxy_set_header Host $host這一句可能導(dǎo)致緩存失敗,所以不能配置這一句。我在測(cè)試的時(shí)候遇到了這個(gè)問(wèn)題,不明原理。?

  • 3、proxy_pass使用upstream出差,換成域名或ip則可行。

**清除緩存** 緩存文件是根據(jù)proxy_cache_key` 這個(gè)指令生成的,所以找到對(duì)應(yīng)的緩存文件,刪除即可

location?~?/purge(/.*)?{ ????#刪除指定緩存區(qū)域cache_one的特定緩存文件$1$is_args$args ????proxy_cache_purge?cache_one?$1$is_args$args; ????#運(yùn)行本機(jī)和10.0.217.0網(wǎng)段的機(jī)器訪問(wèn),拒絕其它所有 ????allow???????????127.0.0.1; ????allow???????????10.0.217.0/24; ????deny??????????all; }

刪除緩存用到proxy_cache_purge指令。

nignx websocket

location?/ws/?{ ????proxy_set_header?Host?$host; ????proxy_http_version?1.1;?#必須 ????proxy_set_header?Upgrade?$http_upgrade;#必須 ????proxy_set_header?Connection?"upgrade";#必須 ????proxy_set_header?X-Real-IP?$remote_addr; ????proxy_set_header?X-Forwarded-For?$proxy_add_x_forwarded_for; ????........ }

nginx防盜鏈

location?~*?.(gif|jpg|png|jpeg)$?{ ????expires?????30d; ????valid_referers?none?blocke?*.chuchur.com?www.chuchur.com?m.chuchur.com?*.baidu.com?*.google.com; ????if?($invalid_referer)?{ ????????rewrite?^/?https://chuchur.cn/404.jpg; ????} }

~*.(jpg|gif|swf)$: 匹配不區(qū)分大小寫(xiě),以.jpg或.gif或.swf結(jié)尾的文件。

valid_referers:設(shè)置信任的網(wǎng)站,可以正常使用圖片。

none:瀏覽器中refer為空的情況,就是直接在瀏覽器訪問(wèn)圖片。

blocked:瀏覽器中refer不為空的情況,但是值被代理或防火墻刪除了,這些值不以http://或 https://開(kāi)頭。

后面的網(wǎng)址或域名:refer包含相關(guān)字符串的網(wǎng)址。

if語(yǔ)句:如果鏈接的來(lái)源域名不在valid_referers所列出的列表中,$invalid_referer為1,則執(zhí)行后面的操作,即進(jìn)行重寫(xiě)或*返回 403頁(yè)面。

nginx for Vue

server?{ ????listen???????80?default_server; ????listen???????[::]:80?default_server; ????server_name??chuchur.com?www.chuchur.com; ????location?/?{ ????????root?~/www/html; ????????index?index.html; ????????try_files?$uri?$uri/?/index.html; ????} }

其他服務(wù)器vue部署請(qǐng)參閱的地址:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90

https

nginx如何開(kāi)啟https和http2(傳送門(mén)

ningxcss字體的支持,需要修改mime.types加入以下代碼

application/octet-stream?eot; application/font-sfnt?ttf; application/font-otf?otf; application/font-woff2?woff2; application/font-woff?woff;

如果是跨域的話,還需要做跨域配置

location?~*?.(eot|ttf|woff|svg|otf)$?{ ??add_header?Access-Control-Allow-Origin?*; }

location優(yōu)先級(jí)

  • [=]模式: location = path,此種模式優(yōu)先級(jí)最高(但要全路徑匹配)

  • [^~]模式:location ^~ path,此種模式優(yōu)先級(jí)第二高于正則;

  • [~ or ~]模式:location ~ path,正則模式,優(yōu)先級(jí)第三,[~]正則匹配區(qū)分大小寫(xiě),[~]正則匹配不區(qū)分大小寫(xiě);

  • [path]模式: location path,中間什么都不加,直接跟路徑表達(dá)式; 注意:一次請(qǐng)求只能匹配一個(gè)location,一旦匹配成功后,便不再繼續(xù)匹配其余l(xiāng)ocation;

隱藏nignx版本號(hào)

#將Nginx的配置文件中的server_tokens選項(xiàng)值設(shè)置為off,如沒(méi)有該配置項(xiàng),加上即可。 vim?/usr/local/nginx/conf/nginx.conf ...........????#省略內(nèi)容 ????http?{ ???????include???????mime.types; ???????default_type??application/octet-stream; ???????server_tokens?????off;????#關(guān)閉版本號(hào) ............????#省略內(nèi)容

相關(guān)命令

nginx?-t?#檢查查看配置文件路徑,其配置是否正確 nginx?-s?reload?#?重啟 nginx?-s?quit?#退出 ningx?-s?stop?#停止

常見(jiàn)問(wèn)題

nginx讀取文件permission denied,這種情況直接會(huì)導(dǎo)致404?

[error]?17823#17823:?*21?open()?"/var/www/html/index.html"?failed?(13:?Permission?denied),?client:?101.228.94.31,?server:?_

解決辦法: 修改/etc/nginx/nginx.conf:

?#?user?nginx; user?root;??##root權(quán)限或其他 worker_processes?auto; pid?/run/nginx.pid;

connect() failed (111: Connection refused) while connecting to upstream

#proxy_set_header?Host?$host?#注釋掉這句

如果反向代理服務(wù)器不重寫(xiě)該請(qǐng)求頭的話,那么后端真實(shí)服務(wù)器在處理時(shí)會(huì)認(rèn)為所有的請(qǐng)求都來(lái)在反向代理服務(wù)器,如果后端有防攻擊策略的話,那么機(jī)器就被封掉了。因此,在配置用作反向代理的nginx中一般會(huì)增加兩條配置,修改http的請(qǐng)求頭:

proxy_set_header?Host?$http_host; proxy_set_header?X-Forward-For?$remote_addr;

這里的$http_host和$remote_addr都是nginx的導(dǎo)出變量,可以再配置文件中直接使用。如果Host請(qǐng)求頭部沒(méi)有出現(xiàn)在請(qǐng)求頭中,則$http_host值為空,但是$host值>為主域名。因此,一般而言,會(huì)用$host代替$http_host變量,從而避免http請(qǐng)求中丟失Host頭部的情況下Host不被重寫(xiě)的失誤。

內(nèi)置變量

$arg_name

請(qǐng)求中的的參數(shù)名,即“?”后面的arg_name=arg_value形式的arg_name

$args

請(qǐng)求中的參數(shù)值

$binary_remote_addr客戶端地址的二進(jìn)制形式,固定長(zhǎng)度為 4 個(gè)字節(jié)

$body_bytes_sent

傳輸給客戶端的字節(jié)數(shù),響應(yīng)頭不計(jì)算在內(nèi);這個(gè)變量和apache的mod_log_config模塊中的“%B”參數(shù)保持兼容

$bytes_sent

傳輸給客戶端的字節(jié)數(shù) (1.3.8, 1.2.5)

$connection

TCP連接的序列號(hào) (1.3.8, 1.2.5)

$connection_requests

TCP連接當(dāng)前的請(qǐng)求數(shù)量 (1.3.8, 1.2.5)

$content_Length

“Content-Length” 請(qǐng)求頭字段

$content_type?

“Content-Type”請(qǐng)求頭字段

$cookie_name

cookie名稱

$document_root

當(dāng)前請(qǐng)求的文檔根目錄或別名

$document_uri

同$uri

$host

優(yōu)先級(jí)如下:HTTP請(qǐng)求行的主機(jī)名”HOST”請(qǐng)求頭字段>符合請(qǐng)求的服務(wù)器名

$hostname

主機(jī)名

$http_name

匹配任意請(qǐng)求頭字段; 變量名中的后半部分“name”可以替換成任意請(qǐng)求頭字段,如在配置文件中需要獲取http請(qǐng)求頭:“Accept-Language”,那么將“-”替換為下劃線,大寫(xiě)字母替換為小寫(xiě),形如:$http_accept_language即可。

$https

如果開(kāi)啟了ssl安全模式,值為“on”,否則為空字符串。

$is_args

如果請(qǐng)求中有參數(shù),值為“?”,否則為空字符串。

$limit_rate

用于設(shè)置響應(yīng)的速度限制,詳見(jiàn)limit_rate。

$msec

當(dāng)前的unix時(shí)間戳 (1.3.9, 1.2.6)

$nginx_version nginx版本

$pid

工作進(jìn)程的PID

$pipe

如果請(qǐng)求來(lái)自管道通信,值為“p”,否則為“.” (1.3.12, 1.2.7)

$proxy_protocol_addr

獲取代理訪問(wèn)服務(wù)器的客戶端地址,如果是直接訪問(wèn),該值為空字符串。(1.5.12)

$query_string

同$args

$realpath_root

當(dāng)前請(qǐng)求的文檔根目錄或別名的真實(shí)路徑,會(huì)將所有符號(hào)連接轉(zhuǎn)換為真實(shí)路徑。

$remote_addr

客戶端地址

$remote_port

客戶端端口

$remote_user

用于HTTP基礎(chǔ)認(rèn)證服務(wù)的用戶名

$request

代表客戶端的請(qǐng)求地址

$request_body客戶端的請(qǐng)求主體

此變量可在location中使用,將請(qǐng)求主體通過(guò)proxy_pass, fastcgi_pass, uwsgi_pass, 和 scgi_pass傳遞給下一級(jí)的代理服務(wù)器。

$request_body_file

將客戶端請(qǐng)求主體保存在臨時(shí)文件中。文件處理結(jié)束后,此文件需刪除。如果需要之一開(kāi)啟此功能,需要設(shè)置client_body_in_file_only。如果將次文件傳遞給后端的代理服務(wù)器,需要禁用request body,即設(shè)置

proxy_pass_request_body?off; fastcgi_pass_request_body?off; uwsgi_pass_request_body?off?#or?scgi_pass_request_body?off

$request_completion

如果請(qǐng)求成功,值為”O(jiān)K”,如果請(qǐng)求未完成或者請(qǐng)求不是一個(gè)范圍請(qǐng)求的最后一部分,則為空。

$request_filename?

當(dāng)前連接請(qǐng)求的文件路徑,由root或alias指令與URI請(qǐng)求生成。

$request_length

請(qǐng)求的長(zhǎng)度 (包括請(qǐng)求的地址, http請(qǐng)求頭和請(qǐng)求主體) (1.3.12, 1.2.7)

$request_method

HTTP請(qǐng)求方法,通常為“GET”或“POST”

$request_time

處理客戶端請(qǐng)求使用的時(shí)間 (1.3.9, 1.2.6); 從讀取客戶端的第一個(gè)字節(jié)開(kāi)始計(jì)時(shí)。

$request_uri

這個(gè)變量等于包含一些客戶端請(qǐng)求參數(shù)的原始URI,它無(wú)法修改,請(qǐng)查看$uri更改或重寫(xiě)URI,不包含主機(jī)名,例如:”/cnphp/test.php?arg=freemouse”。

$scheme

請(qǐng)求使用的Web協(xié)議,“http”或“https”

$sent_http_name

可以設(shè)置任意http響應(yīng)頭字段; 變量名中的后半部分“name”可以替換成任意響應(yīng)頭字段,如需要設(shè)置響應(yīng)頭Content-length,那么將“-”替換為下劃線,大寫(xiě)字母替換為小寫(xiě),形如:$sent_http_content_length 4096即可。

$server_addr服務(wù)器端地址,需要注意的是:為了避免訪問(wèn)linux系統(tǒng)內(nèi)核,應(yīng)將ip地址提前設(shè)置在配置文件中。

$server_name

服務(wù)器名,www.cnphp.info

$server_port

服務(wù)器端口

$server_protocol

服務(wù)器的HTTP版本, 通常為“HTTP/1.0”或“HTTP/1.1”

$status

HTTP響應(yīng)代碼 (1.3.2, 1.2.2)

$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space

客戶端TCP連接的具體信息

$time_iso8601

服務(wù)器時(shí)間的ISO 8610格式 (1.3.12, 1.2.7)

$time_local

服務(wù)器時(shí)間(LOG format 格式) (1.3.12, 1.2.7)

$uri

請(qǐng)求中的當(dāng)前 URI(不帶請(qǐng)求參數(shù),參數(shù)位于$args),可以不同于瀏覽器傳遞的$request_uri的值,它可以通過(guò)內(nèi)部重定向,或者使用index指令進(jìn)行修改,$uri不包含主機(jī)名,如”/foo/bar.html”。

常見(jiàn)問(wèn)題

Active: inactive (dead)

sudo?systemctl?enable?nginx.service sudo?systemctl?start?nginx.service sudo?systemctl?status?nginx.service

推薦學(xué)習(xí):傳送門(mén)、傳送門(mén)

以上就是淺析

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊12 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)月度會(huì)員