<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 前言 消息爆炸的時代,對于速度的追逐已成了大家的標配。為了讓自己的網站有更好的訪問體驗,網頁加載控制在 3s 內,決定了網友愿不愿等你。靜態文件的緩存優化了網頁加載,超時機制會讓 Client 與 Server 的響應不會長時間阻塞,GZIP 壓縮提升 IO 效率、減少我們發送的數據量,限流來預防 DOS 攻擊,TCP 參數調優提升傳輸效率。如何加速網頁加載,提升網站訪問的性能? # Nginx 的系統結構 Nginx 包含一個單一的 master 進程和多個 worker 進程。所有的這些進程都是單線程,并且設計為同時處理成千上萬個連接。worker 進程是處理連接的地方,它用于處理客戶端請求。master 進程負責讀取配置文件、處理套接字、派生 worker 進程、打開日志文件等。總之, master 進程是一個可以通過處理信號響應來管理請求的進程。 CentOS7 下載安裝 Nginx 準備好一臺裸機,裝好 CentOS7 系統 # 1、添加源 默認情況 Centos7 中無 Nginx 的源,最近發現 Nginx 官網提供了 Centos 的源地址。因此可以如下執行命令添加源: ``` sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm ``` # 2、安裝 Nginx 通過 yum search nginx 看是否已經添加源成功。 如果成功則執行下列命令安裝 Nginx。 ``` sudo yum install -y nginx ``` # 3、Nginx 開機自動運行 ``` sudo systemctl start nginx.service sudo systemctl enable nginx.service ``` 常規參數講解 進入 /etc/nginx 文件夾,編輯 nginx.conf ,可以看到下面的參數。簡單介紹下: ``` # nginx進程數,建議按照cpu數目來指定,一般跟cpu核數相同或為它的倍數。 worker_processes 8; #為每個進程分配cpu,上例中將8個進程分配到8個cpu,當然可以寫多個,或者將一個進程分配到多個cpu。 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; # 作用于event的I/O多路復用模型 use epoll; #收到新連接通知后接受盡可能多的連接,作用于event multi_accept on; ``` epoll 接口作為 poll 接口的變體在 Linux 內核 2.5 中被引入。相比 select 實現的多路復用 I/O 模型,epoll 最大的好處在于它不會隨著被監控描述符數目的增長而導致效率急速下降。 # 動靜分離 將靜態文件存儲到 /usr/share/nginx/html 文件夾中,配置靜態文件攔截規則。單個項目可以直接放在 /usr/share/nginx/html 根目錄下,如果是多個項目,則要根據項目的根目錄創建文件夾來保存靜態文件。 ![](https://img.kancloud.cn/bd/43/bd435574a49d28550e28fb3350d8526e_1299x545.jpg) 配置攔截規則如下: ``` location ~ .*\.(eot|svg|ttf|woff|jpg|jpeg|gif|png|ico|cur|gz|svgz|mp4|ogg|ogv|webm) { #所有靜態文件直接讀取硬盤 root /usr/share/nginx/html; expires 30d; #緩存30天 } location ~ .*\.(js|css)?${ #所有靜態文件直接讀取硬盤 root /usr/share/nginx/html; expires 12h; } ``` 結果:https://www.ygoclub.com 這個網站的訪問速度從 2s 下降到 300-400ms,大部分內容都將從靜態文件目錄或者硬盤中讀取。 ![](https://img.kancloud.cn/ca/46/ca46887b1bb5c730fde1a8601b486863_1202x335.jpg) # 緩存配置 配置三步走: * [ ] 客戶端、代理請求緩存 * [ ] 設置緩存空間,存儲緩存文件 * [ ] 在 location 中使用緩存空間 * [ ] 打開文件的緩存配置 ``` #客戶端請求主體的緩沖區大小 client_body_buffer_size 512k; #客戶端請求頭部的緩沖區大小,這個可以根據系統分頁大小來設置 client_header_buffer_size 4k; client_max_body_size 512k; large_client_header_buffers 2 8k; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; #指定在何種情況下一個失敗的請求應該被發送到下一臺后端服務器 proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header; #設置緩存空間,存儲緩存文件 proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50g inactive=168h; #在location中使用緩存空間,pathname是項目的目錄,請自定義 location /pathname { proxy_set_header X-Real-IP $remote_addr; proxy_cache nginx-cache; proxy_cache_valid 200 304 302 5d; proxy_cache_valid any 5d; proxy_cache_key '$host:$server_port$request_uri'; add_header X-Cache '$upstream_cache_status from $host'; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://localhost/pathname; } #打開文件的緩存配置 #為打開文件指定緩存,默認是沒有啟用的,max 指定緩存數量,建議和打開文件數一致,inactive 是指經過多長時間文件沒被請求后刪除緩存。 open_file_cache max=65535 inactive=60s; #文件描述符一直是在緩存中打開的,如果有一個文件在inactive時間內一次沒被使用,它將被移除。 open_file_cache_min_uses 1; #指定多長時間檢查一次緩存的有效信息。 open_file_cache_valid 80s; ``` 上述配置的結果,我們可以看到生成了很多緩存文件在 /data/nginx-cache 文件夾下面。 ![](https://img.kancloud.cn/1a/f8/1af8cec287eeb7b35a90299f0fccdcec_404x157.jpg) 我們打開其中一個文件看看,會發現一些蹊蹺,這里存儲了請求頭的信息。當我們處理一個 HTTP 請求的時候,它會先從這里讀取。 ![](https://img.kancloud.cn/d6/ad/d6adee9d7eaacb4215529578c1e1d543_636x187.jpg) ``` #客戶端、服務端設置 server_names_hash_bucket_size 128; server_names_hash_max_size 512; # 長連接超時配置 keepalive_timeout 65; client_header_timeout 15s; client_body_timeout 15s; send_timeout 60s; #代理設置 #與后端服務器建立連接的超時時間。注意這個一般不能大于75秒 proxy_connect_timeout 30s; proxy_send_timeout 120s; #從后端服務器讀取響應的超時 proxy_read_timeout 120s; ``` # GZIP 壓縮 在我們進行 gzip 打包壓縮之前,最好將一些靜態文件先進行壓縮為 min 文件,請求的時候合并為同一文件。再通過 gzip 壓縮后,你會發現網站加載又加速了。 ``` #開啟gzip,減少我們發送的數據量 gzip on; #允許壓縮的最小字節數 gzip_min_length 1k; #4個單位為16k的內存作為壓縮結果流緩存 gzip_buffers 4 16k; #設置識別HTTP協議版本,默認是1.1 gzip_http_version 1.1; #gzip壓縮比,可在1~9中設置,1壓縮比最小,速度最快,9壓縮比最大,速度最慢,消耗CPU gzip_comp_level 4; #壓縮的類型 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; #給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮 gzip_vary on; #禁用IE6以下的gzip壓縮,IE6的某些版本對gzip的壓縮支持很不好 gzip_disable "MSIE [1-6]."; ``` # 訪問限流 我們構建網站是為了讓用戶訪問它們,我們希望用于合法訪問。所以不得不采取一些措施限制濫用訪問的用戶。這種濫用指的是從同一IP每秒到服務器請求的連接數。因為這可能是在同一時間內,世界各地的多臺機器上的爬蟲機器人多次嘗試爬取網站的內容。 ``` #限制用戶連接數來預防DOS攻擊 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; #限制同一客戶端ip最大并發連接數 limit_conn perip 2; #限制同一server最大并發連接數 limit_conn perserver 20; #限制下載速度,根據自身服務器帶寬配置 limit_rate 300k; ``` # 高效數據傳輸配置 ``` #開啟文件的高效傳輸模式。tcp_nopush和tcp_nodelay可防止網絡及磁盤i/o阻塞,提升nginx工作效率; sendfile on; #數據包不會馬上傳送出去,等到數據包最大時,一次性的傳輸出去,這樣有助于解決網絡堵塞。 tcp_nopush on; #只要有數據包產生,不管大小多少,就盡快傳輸 tcp_nodelay on; ``` # 內核參數的優化 編輯 /etc/sysctl.conf 文件,根據需要調整參數配置。 ``` #如果想把timewait降下了就要把tcp_max_tw_buckets值減小,默認是180000 net.ipv4.tcp_max_tw_buckets = 5000 #開啟重用功能,允許將TIME-WAIT狀態的sockets重新用于新的TCP連接 net.ipv4.tcp_tw_reuse = 1 #系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被復位并打印出警告信息。這個限制僅僅是為了防止簡單的DoS攻擊 net.ipv4.tcp_max_orphans = 262144 #當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時。我們可以調短時間跨度 net.ipv4.tcp_keepalive_time = 30 ``` # 日志配置 日志文件對于我們日常運維至關重要,如果沒有日志排查問題,你將很難判斷異常的所在,要解決問題無異于大海撈針。日志的保存時必要的,不可缺少的,我們來看下怎么配置有利于排查問題? 關鍵字:其中關鍵字 access_log,error_log 不能改變 error_log 錯誤日志級別:[debug | info | notice | warn | error | crit | alert | emerg],級別越高記錄的信息越少。不要配置 info 等級較低的級別,會帶來大量的磁盤 I/O 消耗。 1. error_log 生產場景一般是 warn | error | crit 這三個級別之一 ``` #定義日志模板 log_format 日志模板名稱 日志格式; #訪問日志 access_log path format gzip[=level] [buffer=size] [flush=time]; 關鍵字 存放的路徑 日志格式模板 gzip壓縮,level指壓縮級別 存放緩存日志的緩存大小 保存在緩存中的最長時間 #錯誤日志 error_log <FILE> <LEVEL>; 關鍵字 日志文件 錯誤日志級別 #示例 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 /Users/jackson/Desktop/www.ygoclub.com-access.log main gzip flush=5m; error_log /Users/jackson/Desktop/www.ygoclub.com-error.log error; ``` 打開 /Users/jackson/Desktop/www.ygoclub.com-error.log 日志文件,我們可以看到很多找不到文件的異常。日志輔助我們找到了問題,只要將文件補充上去就解決了。 ![](https://img.kancloud.cn/bd/43/bd435574a49d28550e28fb3350d8526e_1299x545.jpg) # 實戰配置 ## 1.整體配置 ``` worker_processes 1; pid /var/run/nginx.pid; events { worker_connections 2048; multi_accept on; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"url":"$uri",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"agent":"$http_user_agent",' '"status":"$status"}'; sendfile on; tcp_nopush on; tcp_nodelay on; server_names_hash_bucket_size 128; server_names_hash_max_size 512; keepalive_timeout 65; client_header_timeout 15s; client_body_timeout 15s; send_timeout 60s; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; limit_conn perip 2; limit_conn perserver 20; limit_rate 300k; proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50g inactive=168h; client_body_buffer_size 512k; client_header_buffer_size 4k; client_max_body_size 512k; large_client_header_buffers 2 8k; proxy_connect_timeout 5s; proxy_send_timeout 120s; proxy_read_timeout 120s; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 4; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on; gzip_disable "MSIE [1-6]."; include /etc/nginx/conf.d/*.conf; } ``` ## 2.負載均衡 ``` upstream ygoapi{ server 0.0.0.0:8082 fail_timeout=5 max_fails=3; server 0.0.0.0:8083 fail_timeout=5 max_fails=3; ip_hash; } ``` ## 3.HTTP 配置 ``` #隱藏版本信息 server_tokens off; server { listen 80; server_name www.ygoclub.com; charset utf-8; #重定向HTTP請求到HTTPS return 301 https://$server_name$request_uri; } ``` ## 4.HTTPS 配置 準備條件:需要先去下載 HTTPS 證書 ``` server { listen 443; server_name www.ygoclub.com; ssl on; ssl_certificate cert/證書名稱.pem; ssl_certificate_key cert/證書名稱.key; ssl_session_timeout 5m; # SSL協議配置 ssl_protocols SSLv2 SSLv3 TLSv1.2; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; valid_referers none blocked server_names *.ygoclub.com; #日志配置 access_log /Users/jackson/Desktop/www.ygoclub.com-access.log main gzip=4 flush=5m; error_log /Users/jackson/Desktop/www.ygoclub.com-error.log error; location ~ .*\.(eot|svg|ttf|woff|jpg|jpeg|gif|png|ico|cur|gz|svgz|mp4|ogg|ogv|webm) { proxy_cache nginx-cache; proxy_cache_valid 200 304 302 5d; proxy_cache_key '$host:$server_port$request_uri'; add_header X-Cache '$upstream_cache_status from $host'; #所有靜態文件直接讀取硬盤 root /usr/share/nginx/html; expires 30d; #緩存30天 } location ~ .*\.(js|css)?$ { proxy_cache nginx-cache; proxy_cache_valid 200 304 302 5d; proxy_cache_key '$host:$server_port$request_uri'; add_header X-Cache '$upstream_cache_status from $host'; #所有靜態文件直接讀取硬盤 root /usr/share/nginx/html; expires 12h; } location / { root /usr/share/nginx/html; index index.html index.htm; } location /druid { proxy_set_header X-Real-IP $remote_addr; proxy_cache nginx-cache; proxy_cache_valid 200 10m; proxy_pass http://ygoapi/druid; } location /api { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://ygoapi/api; } # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看