day64:nginx模組之限制連線&狀態監控&Location/用nginx+php跑專案/擴充套件應用節點

Poke發表於2020-10-11

目錄

1.nginx模組:限制連線 limit_conn

2.nginx模組:狀態監控 stub_status

3.nginx模組:Location

4.用nginx+php跑wordpress專案

5.用nginx+php跑edusoho專案

6.用nginx+php跑kodcloud專案

7.擴充套件一臺應用節點

8.拆分資料庫到獨立的伺服器

nginx模組:限制連線 limit_conn

限制連線limit_conn主要用在下載,也就是可以限制同時下載的數量

[root@oldboy-pythonedu mirror]# cat  /etc/nginx/conf.d/mirror.oldboyedu.com.conf 
    limit_conn_zone $binary_remote_addr zone=addr:10m;            # 定義限制的key, 分配區域大小
    server {
        listen 80;
        server_name mirror.oldboyedu.com;
        charset utf8;
        limit_conn addr 1;            # 呼叫區域限制,限制key只可以出現1次, 相當於限制來源客戶端IP的連線數為1
        limit_conn_status 500;        # 限制成功後,會返回500的錯誤狀態碼,預設返回503
        
        limit_rate_after 200m;        # 全速下載200m資源
        limit_rate       300k;        # 達到200m以後,限制300k的速度

        error_page 500 = @testerror;    # 如果 出現500錯誤,則讓其跳轉到內部的 @testerror 
        
        location @testerror {            # 定義 @testerror, 返回具體的動作 
            default_type text/html;
            return 200 '$remote_addr 你超過了最大連線限制, 請充值VIP解封!';
        }
        location / {
            root /code/mirror;
            autoindex on;
            autoindex_exact_size off;
            autoindex_localtime on;
        }
    }

nginx模組:狀態監控 stub_status

    location = /status {
        stub_status;
    }

一共有7種狀態:

Active connections: 2

server accepts handled requests

        74             74       104

Reading: 0 Writing: 1 Waiting: 1

關於7個引數的解釋

Active connections:  活躍的連線數

accepts:  接受的總TCP連線數

handled:  總處理的TCP連線數

requests:  總的 http 請求數

關於Reading,Writing,Waiting的理解

假設現在有兩條船分別為C,S

C船需要S船的一個物品,C船需要S船的1個物品,那麼此時C船就要給S船傳送一個訊息

1.S船收到這個資訊就是reading

2.S船將物資傳送給C船,這個時候就是writing

3.如果C船需要S船很多個物品,那麼需要C船和S船建立起一個物資傳送管道,不斷的傳送物資。這個管道建立起來的時候,就是waiting狀態了。

nginx模組:Location

作用: 控制使用者請求 uri 的具體路徑

用法: location [ = | ~ | ~* | ^~ ] uri { ... }

(多個location時會用上, 但多個location會出現優先順序的問題)

1.Location優先順序

匹配符 匹配規則 優先順序
= 精準匹配 1
^~ 以某個字串開頭 2
~ 區分大小寫的正則匹配 3
~*  不區分大小寫的正則匹配 4
/ 通用匹配,任何請求都會匹配到 5

 

 

 

 

 

 

 

 

當輸入下面的URL時,Location會怎麼匹配呢?

http://location.oldboyedu.com/index.html   location /

http://location.oldboyedu.com/documents/1.html    location /documents/

http://location.oldboyedu.com/images/1.gif    location ^~ /images/

http://location.oldboyedu.com/documents/1.jpg   location ~* \.(gif|jpg|jpeg)

2.Location具體如何使用

server {
    listen 80;
    server_name location2.oldxu.com;

    # 通用匹配,任何請求都會匹配到
    location / {
        root html;
        index index.html;
    }

    # 精準匹配,必須請求的uri是/nginx_status
    location = /nginx_status {
        stub_status;
    }

    # 嚴格區分大小寫,匹配以.php結尾的都走這個location    
    location ~ \.php$ {
        default_type text/html;
        return 200 'php訪問成功';
    }

    # 嚴格區分大小寫,匹配以.jsp結尾的都走這個location 
    location ~ \.jsp$ {
        default_type text/html;
        return 200 'jsp訪問成功';
    }

    # 不區分大小寫匹配,只要使用者訪問.jpg,gif,png,js,css 都走這條location
    location ~* \.(jpg|gif|png|js|css)$ {
        return 403;
    }

    # 不區分大小寫匹配
    location ~* \.(sql|bak|tgz|tar.gz|.git)$ {
        deny all;
    }
}

用nginx+php跑wordpress專案

1.LNMP架構

L = Linux

N = Nginx

M ~= MySQL | Mariadb

P ~= PHP | Python

2.LNMP架構安裝

1.安裝PHP

# 安裝php:
[root@oldboy-pythonedu ~]# rpm -e $(rpm -qa |grep php)   #解除安裝php5版本
[root@oldboy-pythonedu ~]# wget http://cdn.xuliangwei.com/php.zip
[root@oldboy-pythonedu ~]# unzip php.zip 
[root@oldboy-pythonedu ~]# yum localinstall php/*.rpm -y

2.修改PHP程式執行的身份

# 修改程式執行的身份
[root@oldboy-pythonedu ~]# sed -i 's#user = apache#user = nginx#g' /etc/php-fpm.d/www.conf 
[root@oldboy-pythonedu ~]# sed -i 's#group = apache#group = nginx#g' /etc/php-fpm.d/www.conf 

3.啟動php-fpm

# 啟動php-fpm
[root@oldboy-pythonedu ~]# systemctl enable php-fpm
[root@oldboy-pythonedu ~]# systemctl start php-fpm

4.編輯index.php-->用來測試nginx+php能否正常執行

[root@oldboy-pythonedu ~]# cat /code/index.php 
<?php
    phpinfo();
?>

5.編輯配置檔案php.oldboyedu.com-->用來測試nginx+php能否正常執行

# nginx+ php 檢查: 
[root@oldboy-pythonedu ~]# cat /etc/nginx/conf.d/php.oldboyedu.com.conf 
server {
    listen 80;
    server_name php.oldboyedu.com;
    root /code;

    location / {
        index index.php;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

通過訪問php.oldboyedu.com即可檢視nginx+php是否成功

6.安裝mysql

[root@oldboy-pythonedu ~]# yum install mariadb mariadb-server -y
[root@oldboy-pythonedu ~]# systemctl enable mariadb
[root@oldboy-pythonedu ~]# systemctl start mariadb
[root@oldboy-pythonedu ~]# mysqladmin password 'Oldxu.com123'
[root@oldboy-pythonedu ~]# mysql -uroot -pOldxu.com123
MariaDB [(none)]> 
MariaDB [(none)]> create database wordpress charset utf8;

7.編輯mysql.php-->用來測試php+mysql是否成功

[root@oldboy-pythonedu ~]# cat /code/mysql.php 
           <?php
            $servername = "localhost";
            $username = "root";
            $password = "Oldxu.com123";

            // 建立連線
            $conn = mysqli_connect($servername, $username, $password);

            // 檢測連線
            if (!$conn) {
                die("Connection failed: " . mysqli_connect_error());
            }
            echo "php連線MySQL資料庫成功";
            ?>

編輯完程式碼後,輸入如下指令:

[root@oldboy-pythonedu ~]# php /code/mysql.php 

如果出現php連線MySQL資料庫成功,則代表成功

3.部署WordPress

1.下載程式碼,儲存至指定位置,變更許可權

[root@oldboy-pythonedu ~]# cd /code/
[root@oldboy-pythonedu code]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@oldboy-pythonedu code]# tar xf latest-zh_CN.tar.gz 
[root@oldboy-pythonedu code]# chown -R nginx.nginx wordpress/

2.編寫Nginx配置檔案:blog.oldboyedu.com.conf

[root@oldboy-pythonedu code]# cat /etc/nginx/conf.d/blog.oldboyedu.com.conf 
server {
    listen 80;
    server_name blog.oldboyedu.com;
    root /code/wordpress;

    location / {
        index index.php;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

3.檢查語法,重啟nginx服務

[root@oldboy-pythonedu code]# nginx -t
[root@oldboy-pythonedu code]# systemctl reload nginx

4.配置域名解析.訪問瀏覽器.安裝該產品

修改域名的路徑:C:\Windows\System32\drivers\etc\hosts

改成如下格式即可:

用nginx+php跑edusoho專案

前面已經安裝好php和mysql環境了,所以接下來直接跑專案就可以了

1.安裝EduSoho

mkdir /code
cd /code
rz # 上傳檔案
tar xf edusoho-8.2.17.tar.gz

#注意:我們的程式能夠以什麼方式去訪問一個檔案或目錄,取決於程式所執行的使用者身份對該檔案有什麼許可權
chown -R nginx.nginx edusoho

2.編寫nginx配置檔案:edusoho.oldboyedu.com.conf

vim /etc/nginx/conf.d/edusoho.oldboyedu.conf
server {
    listen 80;
    server_name edu.oldboyedu.com;
    root /code/edusoho/web;
    client_max_body_size 1024m;        #允許上傳視訊大小限制
    client_body_buffer_size 100m;    #緩衝區大小(太小會提示a client request body is buffered to a temporary)

    location / {
        index app.php;
        try_files $uri @rewriteapp;
    }

    location @rewriteapp {
        rewrite ^(.*)$ /app.php/$1 last;
    }

    location ~ ^/udisk {
        internal;
        root /code/edusoho/app/data/;
    }

    location ~ ^/(app|app_dev)\.php(/|$) {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  HTTPS              off;
        fastcgi_param HTTP_X-Sendfile-Type X-Accel-Redirect;
        fastcgi_param HTTP_X-Accel-Mapping /udisk=/code/edusoho/app/data/udisk;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 8 128k;
    }

    location ~* \.(jpg|jpeg|gif|png|ico|swf)$ {
        expires 3y;
        access_log off;
        gzip off;
    }

    location ~* \.(css|js)$ {
        access_log off;
        expires 3y;
    }

    location ~ ^/files/.*\.(php|php5)$ {
        deny all;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  HTTPS              off;
        include        fastcgi_params;
    }
}

3.檢查nginx語法,重啟服務

nginx -t
systemctl restart nginx

4.修改php.ini 配置檔案,調整解析器支援的最大上傳限制

vim /etc/php.ini
upload_max_filesize = 1024M
post_max_size = 1024M

systemctl restart php-fpm

5.網站中的一些功能如何使用

用nginx+php跑kodcloud專案

1.nginx+php環境

...前面已經介紹了,這裡不再多bb

2.下載kodcloud程式碼

[root@oldboy-pythonedu ~]# cd /code
[root@oldboy-pythonedu code]# wget http://static.kodcloud.com/update/download/kodbox.1.13.zip
[root@oldboy-pythonedu code]# mkdir kodcloud
[root@oldboy-pythonedu code]# unzip kodbox.1.13.zip -d kodcloud/
[root@oldboy-pythonedu code]# chown -R nginx.nginx /code/kodcloud/

3.修改nginx配置檔案:kod.oldboyedu.com.conf

[root@oldboy-pythonedu code]# cat /etc/nginx/conf.d/kod.oldboyedu.com.conf
server {
    listen 80;
    server_name kod.oldboyedu.com;
    root /code/kodcloud;

    location / {
        index index.php;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

4.檢查nginx語法--重啟nginx服務--域名解析

....這幾個指令前面有介紹,這裡不在bb

擴充套件一臺應用節點

擴充套件應用節點,說白了,就是再建立一臺虛擬機器。。

1.克隆一臺全新的虛擬機器,並修改IP地址

sed -i 's#old#new#g' /etc/sysconfig/network-scripts/ifcfg-ens32 # 將10.0.0.200替換成10.0.0.201

    # old: 舊的IP尾號
    # new: 新的IP尾號

[root@oldboy-pythonedu ~]# hostnamectl set-hostname node2 # 修改主機名稱

2.安裝各種需要的環境

# 1.安裝Nginx PHP環境
[root@node2 ~]# yum install vim net-tools unzip wget lrzsz -y            # 安裝基礎工具
[root@node2 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  # 配置epel源


# 2.安裝Nginx
[root@node2 ~]# yum install nginx -y

# 3.安裝PHP
[root@node2 ~]# unzip php.zip
[root@node2 ~]# yum localinstall php/*.rpm -y


# 4.拷貝Nginx配置    scp
[root@node2 ~]# scp root@10.0.0.200:/etc/nginx/nginx.conf /etc/nginx/nginx.conf
[root@node2 ~]# scp -r root@10.0.0.200:/etc/nginx/conf.d/*.conf /etc/nginx/conf.d/

# 5.拷貝php配置
[root@node2 ~]# scp root@10.0.0.200:/etc/php.ini /etc/php.ini   
[root@node2 ~]# scp root@10.0.0.200:/etc/php-fpm.d/www.conf  /etc/php-fpm.d/www.conf 
    

# 6.關閉防火牆
[root@node2 ~]# systemctl disable firewalld
[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]# setenforce 0
[root@node2 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config


# 7.拷貝所有程式碼
[root@node2 ~]# scp -rp root@10.0.0.200:/code /
[root@node2 ~]# chown -R nginx.nginx /code/
    
# 8.啟動服務
[root@node2 ~]# systemctl enable nginx php-fpm
[root@node2 ~]# systemctl start nginx php-fpm

拆分資料庫到獨立的伺服器

1.準備基礎環境, 修改IP地址,修改主機名稱,關閉防火牆

sed -i 's#201#202#g' /etc/sysconfig/network-scripts/ifcfg-ens32 
systemctl restart network
hostnamectl set-hostname node-mysql
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

yum install vim net-tools unzip wget lrzsz -y
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

2.安裝Mariadb

[root@oldboy-pythonedu ~]# yum install mariadb mariadb-server -y
[root@oldboy-pythonedu ~]# systemctl enable mariadb
[root@oldboy-pythonedu ~]# systemctl start mariadb
[root@oldboy-pythonedu ~]# mysql
MariaDB [(none)]> grant all privileges on *.* to 'all'@'%' identified by 'Oldxu.com123';
MariaDB [(none)]>

3.將10.0.0.200資料庫中的資料庫備份下來,然後恢復至 10.0.0.202 主機的MySQL上

[root@oldboy-pythonedu ~]# mysqldump -uroot -pOldxu.com123 -B wordpress edusoho > bak.sql
[root@oldboy-pythonedu ~]# scp bak.sql root@10.0.0.202:~

4.在10.0.0.202的資料庫上恢復資料

[root@oldboy-pythonedu ~]# mysql < bak.sql

5.在10.0.0.201上修改連線資料庫的地址(所有應用節點都需要操作)

# Wordpress:
    [root@node2 ~]# vim /code/wordpress/wp-config.php
    define( 'DB_NAME', 'wordpress' );

    /** MySQL資料庫使用者名稱 */
    define( 'DB_USER', 'all' );

    /** MySQL資料庫密碼 */
    define( 'DB_PASSWORD', 'Oldxu.com123' );

    /** MySQL主機 */
    define( 'DB_HOST', '10.0.0.202' );


# edusohu:
    [root@node2 ~]# vim /code/edusoho/app/config/parameters.yml
    parameters:
        database_driver: pdo_mysql
        database_host: 10.0.0.202
        database_port: 3306
        database_name: edusoho
        database_user: all
        database_password: 'Oldxu.com123'

6.edusoho存在快取,需要清除一下

[root@node2 ~]# rm -rf /code/edusoho/app/cache/*

Tip:目前有三臺主機,他們的關係如下所示,後面還會再加上一臺。

相關文章