第十三週作業

搭建時間服務器,日誌服務器並簡述sudo安全切換

CHRONY
對於時間服務器只介紹幾個關鍵的核心知識:

在分佈式環境中,相互協作的服務器不需要時間準確,但是要保證時間的一致性,但是有些服務會對時間的準確性有嚴格的要求。
linux在啓動時由內核讀取硬件時間,啓動後系統時間與硬件時間相互獨立運行,沒有交集。對於虛擬機來說,它的時間有天然的不確定性,因爲它的CPU是由宿主機分配過來的一點CPU。所以假如宿主機的CPU時鐘頻率震盪爲1分鐘,那麼虛擬機的可能也就是30秒。
假如服務器慢了24小時,不能將服務器的時間直接跳至準確的時間,因爲中間的時間會出現空白,導致文件出現異常。所以需要將服務器的時間加快。直到它恢復正常時間。而不是直接跳轉。
linux開始使用的是ntp軟件,後來使用的chrony。後者更好用,更方便
無論是ntp和chrony,既可以當作客戶端,也可以當作服務端。也就是可以是單機同步,也可以讓別人來同步你的時間。

測試環境:

server# yum –y install ntp chrony 
server# vim /etc/chrony/chrony.conf
server 0.ntp.aliyun.com iburst 
  server 1.ntp1.aliyun.com iburst
    allow 192.168.1.0/24
    server# systemctl restart chrony

注意:添加時間服務器,0.後面沒有空格。allow:是允許同步的IP範圍。
客戶端亦是如此,僅將服務器地址設置爲之前主機IP即可,查看同步狀態:chrnyc sourcestats

### 搭建日誌服務器
rserver~]# vim /etc/rsyslog.conf
### Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

### Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
    *.info;mail.none;authpriv.none;cron.none   :ommysql:192.168.1.91,Syslog,rsyslog,123

 rclient ~]# yum -y install mariadn mariadb-server
rclient ~]# vim /etc/my.cnf.d/server.cnf
    skip_name_resolve=on
    innodb_file_per_table=on
rclient ~]# yum -y install rsyslog-mysql
rclient ~]# mysql
    \. /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
    grant all on Syslog.* to ‘rsyslog’@’192.168.1.%’ identified by ‘123’;
    flush privileges;
rclient ~]# vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none                @192.168.1.88
rclient ~]#yum –y install httpd php
    documentroot /var/www/rsyslog
    <directory “/var/www/rsyslog”>
    require all granted
    allowoverride none
</directory>
rclient ~] cp -a loganalyzer-4.1.6/src /var/www/rsyslog
rclient ~] cp -a /loganalyzer-4.1.6/contrib/*.sh /var/www/rsyslog/
rclient ~] chmod +x /var/www/rsyslog/configure.sh
rclient ~] configure.sh
rclient ~] 

3)sudo 安全切換

sudo 能夠讓獲得授權的用戶以另外一個用戶(一般爲root用戶)的身份運行指定的命令
授權配置文件/etc/sudoers,但是一般使用visudo命令進行編輯。因爲誤操作引起系統異常。
授權配置文件的格式:
users  hosts=(runas)   commands
含義是,users列表中的用戶(組),可以在hosts列表的位置上,以runas用戶的身份來運行commands命令列表中的命令。
各個字段可能的值 爲:
users:  sudo命令的發起用戶
用戶名 或uid
%用戶組名  或%gid   (這裏要注意用戶需把基本組切換爲該用戶組,才能使用sudo)

User_Alias 用戶別名
hosts:  允許的地址
ip地址
主機名
NetAddr
Host_Alias 主機別名
runas:   以某一用戶的身份執行
用戶名 或uid
Runas_Alias 用戶別名
commands: 指定的命令列表
command(命令建議使用完整的絕對路徑)
!command 表示禁止某一命令
directory
sudoedit:特殊權限,可用於向其它用戶授予sudo權限
Cmnd_Alias    命令別名
這幾個字段中hosts,runas, commands都可以用ALL來表示所有。
定義別名的方法:
ALIAS_TYPE NAME=item1,item2,item3,...
NAME:別名名稱,必須使用全大寫字符
ALIAS_TYPE :User_Alias,Host_Alias,Runas_Alias ,Cmnd_Alias
sodu命令執行時會要求用戶輸入自己的密碼,爲了避免頻繁驗密與安全其見,能記錄成功認證結果一段時間,默認爲5分鐘,即5分鐘內不需要再驗證用戶密碼。
以sudo的方式來運行指定的命令
sudo   [options]  COMMAND
-l  列出sudo配置文件中用戶能執行的命令
-k  清除此前緩存用戶成功認證結果,之後再次運行sudo時要驗證用戶密碼。
如果想要讓用戶輸入部分命令時不需要進行密碼驗證,在sudo配置文件中commands列表部分,可以在命令列表前面加上"NOPASSWD",則其後的命令不需要密碼,如果某些命令又需要密碼就在前面加上“PASSWD”,所以commands列表可以爲這種格式:
NOPASSWD  不需要密碼的命令列表  PASSWD  需要密碼的命令列表
安全提示:在sudo配置文件中
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
上面配置中root用戶這行沒有問題,但是%wheel這行要注意,如果把某用戶加入到%wheel組,當用戶把基本組切換爲wheel組時就可以像root用戶一樣運行命令,較有風險的命令舉例如下:
sudo su - root    不需要密碼就可以切換到root用戶
sudo  passwd  root    修改root用戶密碼,不需要輸入原密碼。
建議把%wheel改爲  %wheel ALL=(ALL)   ALL,!/bin/su,!/usr/bin/passwd root

詳解nginx模塊使用方法

一、Nginx之目錄瀏覽
二、Nginx之log模塊
三、Ning之gzip模塊
四、Nginx之https服務
五、Nginx之fastCGI模塊
一、配置Nginx提供目錄瀏覽功能
1.修改nginx配置文件
server { 
    listen       80; 
    server_name  www.nginx.com; 
    location / { 
    autoindex on; 
    autoindex_exact_size on; 
    autoindex_localtime on; 
    root   /data/www; 
    index  123.html; 
    } 
}
2.瀏覽器打開驗證
autoindex_exact_size off;默認爲on,顯示出文件的確切大小,單位是bytes。改爲off後,顯示出文件的大概大小,單位是kB或者MB或者GB。
autoindex_localtime on;默認爲off,顯示的文件時間爲GMT時間。改爲on後,顯示的文件時間爲文件的服務器時間。

二、Nginx之log模塊
ngx_http_log_module

1.access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
//記錄日誌,
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition]
access_log syslog:server=address[,parameter=value][format[if=condition]];
access_log off //關閉
例如:access_log logs/access.log combined;
2.log_format name [escape=default|json] string ...;
//定義日誌格式,是nginx內建的
$bytes_sent //發送字節數
$connection  //連接序列號
$connection_requests //連接請求 
$msec       //毫秒解析
$pipe       //管道
$request_length  //請求長度
$request_time  //請求時間
$status         //狀態
$time_iso8601 //日期格式
$time_local     //本地時間
http://nginx.org/en/docs/http/ngx_http_core_module.html
//尾部有很多變量
//nginx有內置的log_format,不需要自定義變量進行使用

例如:log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

3.open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
//加快日誌查找,緩存日誌
open_log_file_cache off; //日誌文件需要大量寫入,頻繁查找並打開浪費大量資源,必要時開啓
max:緩存多少條目
inactive:失效時間
min_uses:在指定時間內最少使用的次數
valid:多長時間檢查一次有效性
off:關閉
三、Ning之gzip模塊
ngx_http_gzip_module //顧慮器,對指定類型的資源壓縮以節約資源 
1.gzip on|off //是否啓用,並不是所有的瀏覽器都支持壓縮
gzip_buffers
2.gzip_comp_level //默認級別爲1,
3.gzip_disable regex.. //匹配瀏覽器類型,對其不進行壓縮
msie6
MSIE [4-6].
4.gzip_min_length LENGTH //觸發啓用壓縮功能的響應報文的最小長度
5.gzip_http_version 1.0|1.1 //設定啓用壓縮響應功能時,http協議版本最小版本
6.gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...
對代理的請求基於何種屬性判斷其是否應該啓用壓縮功能;
off:所有代理請求都不壓縮
expired:
no-cache:
7.gzip_types MIME-TYPE //指定僅執行壓縮的資源內容類型,默認爲text/html;

示例:
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types txt/plain txt/xml application/json application/java-script;

四、Nginx之https服務
1.ngx_http_ssl_module模塊簡介
ssl
ssl:位於傳輸層和應用層之間的半層
1.建立tcp三次會話
2.s發送證書給客戶端,以及s支持的各種加密算法
3.驗證{s證書有效性,受信任的CA頒發的,證書主體,證書完整性}對比特徵碼,併發送給s自己支持的算法
4.從證書中獲取的是對方的公鑰,公鑰加密算法性能不佳,因此進行密鑰交換,DH算法,IKE算法等
爲了防止別人插入廣告:做全棧https
ssL通過握手建立鏈接
ssl拆除:在tcp斷開之前
ssl建立:在tcp建立鏈接之後 //一般ssl:建立鏈接對cpu壓力很大
ngx_http_ssl_module
1.ssl on | off; //是否啓用
2.ssl_certificate file; //pem格式,本地證書
3.ssl_certificate_key file; //私鑰pem格式
//Context http,server

c-->請求https服務,發送http請求  
注:在tcp層和ssl層使用的都是基於ip的通信,沒有用到FQDN
    域名只有在http請求報文的首部的時候會使用到,而http請求報文實在ssl內部完成的,
    也就是說在http會話的時候首部的主機名,基本都沒有發生作用
ssl建立的過程中,雙方身份的識別,是基於ip地址進行的

因此:單ip只提供一個https虛擬主機

4.ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
    //ssl v2已經不安全了,因此建議使用tls,v1.1,v1.2版本
5.ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
    指定ssl緩存機制,應該開啓,提高性能
    none:委婉的拒絕或同意
    builtin:使用openssl庫內建的緩存機制,每個worker之間的緩存是不共享的
        worker獨立自主管理session,命中率不高{進程第一次被第一個worker服務,第二次可能被第二個服務}
    shared:各worker共享的緩存,由nginx進程管理該空間,默認單位bytes,1M大多存儲4000個會話,cache名字相同可以被多個server共用
    name:緩存空間的名稱
    例如:ssl_session_cache builtin:1000 shared:SSL:10m;
6.ssl_ciphers ciphers
    Default:ssl_ciphers HIGH:!aNULL:!MD5; //openssl所支持的加密算法
    ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    openssl ciphers //獲取ssl支持的算法
7.ssl_session_timeout time;//重新使用cache中的session     
    ssl會話超時時長,指ssl session cache中緩存條目的緩存時長  
    ssl_session_timeout 5m; //默認5min,調大有助於提高服務器性能
8.ssl_prefer_server_ciphers on|off //server傾向於
    sslv3和TLS,優先使用server端使用的加密算法
2.配置實現
實驗1:配置ssl實現 //自己同時兼任nginx和ca
1.nginx server: 
cd /etc/nginx/ssl/
(umask 077;openssl genrsa -out nginx.key 2048) 
openssl req -new -key nginx.key -out nginx.csr -days 365 //生成請求和自籤用的都是-key
//www.mt.com
2.CA端
cd /etc/pki/CA/
(umask 077;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
//ca.mt.com 
touch serial index.txt
echo 01 > serial
cd /etc/nginx/ssl
openssl ca -in nginx.csr -out nginx.crt -days 365

nginx -t
ningx -s reload
//雖然不受信任,但是通訊過程式加密的
3.配置文件

server {
    listen 443 ssl;
    server_name www.mt.com;

    ssl_certificate  /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    root /web/www/;

    index index.html index.htm;
    location /status {
        stub_status;
    }
}
五、Nginx之fastCGI模塊
1.LNMP概述
LAMP(fpm):
httpd+php:
modules;
cgi:
fcgi:
proxy_fastcgi_module
lNMP:
ngx_http_fastcgi_module
nginx+php: //只有一種選擇
nginx+fastcgi
MySQL的連接器有多個:c,php等各不相同

clinet==>nginx--->fpm--->MySQL
php:編譯時,支持fpm;./configure --enable-fpm
php-fpm工作方式,類似於httpd的prefork
listen = 127.0.0.1:9000
listen.allow_clients = //允許訪問的主機
pm = dynamic|static
pm.start_servers:啓動fpm進程時啓動的工作進程數量
pm.min_spare_server:最小空閒進程數
pm.max_spare_servers:最大空閒進程數
pm.max_children:最大工作進程數
user = USERNAME
group = GROUPNAME

2.ngx_http_fastcgi_module
yum info php-fpm
yum install php-fpm
yum install php-mysql php-mbstring php-gd php-xml -y
    vim /etc/php-fpm.d/www.conf 
systemctl start php-fpm
1.vim nginx.conf //動靜分離案例
    location ~ \.php$ {
            root /web/www/;
            fastcgi_pass 127.0.0.1:9000;  //傳送給誰
            fastcgi_index index.php;        //主頁
            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name; //把後面的參數保存在SCRIPT_FILENAME這個變量中
            include fastcgi_params;    /etc/nginx/fastcgi_params該文件中定義了很多params    
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
            root /usr/share/nginx/html;
            #cache
            expires 3d;
        }           
    }       
2.mkdir -pv /usr/local/nginx/html //php文件真實位置
3.https://www.mt.com/info.php //
    對應SCRIPT_FILENAME:/usr/local/nginx/html/info.php
        $fastcgi_script_name對應的是php.info
    然後發送給127.0.0.1:9000
模塊指令:
1.fastcgi_pass address: //address是fpm服務器監聽的地址和端口
fastcgi_pass localhost:9000;
2.fastcgi_index index.php;
3.fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;

4.fastcgi_cache zone |off //是否啓用cache,如果啓用  ,數據使用哪個緩存空間名稱
5.fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] 
    keys_zone=name:size [inactive=time] [max_size=size] 
        [manager_files=number] [manager_sleep=time] [manager_threshold=time] 
        [loader_files=number] [loader_sleep=time] [loader_threshold=time]
        [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];  
    //定義緩存空間,以及如何存儲數據,Context:http
    path:文件系統路徑,用於存放緩存的文件數據
    levels=#[:#][:#]層級,最多三級結構 // levels=1:2
    keys_zone=name:size //定義內存中用於緩存kv映射關係的空間名稱及大小
    inactive=time:非活動時間
    max_size=size:緩存空間上限
    例如:fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fcgicache:10m;
    fastcgi_cache fcgicache
    注:只能用於http
6.fastcgi_cache_key  127.0.0.1:9000$request_uri //把什麼當做key,緩存到內存中       
    //定義要使用的緩存鍵key,例如 fastcgi_cache  $request_uri

7.fastcgi_cache_methods GET|HEAD|POST..; //緩存哪些類型的請求
8.fastcgi_cache_min_uses number//最少使用次數
9.fastcgi_cache_valid [code..] time;//哪一種響應碼,緩存多長時間
    默認不給緩存,對不同響應碼,設定其緩存
    fastcgi_cache_valid 200 302 10m;

nginx有緩存,fpm也有緩存
nginx如何爲fpm緩存
key-value //nginx緩存的是元數據,以及目錄結構,錯誤查找結果等
N級子目錄: 2 1 1//一級目錄256個,每一級目錄16個子目錄,每二級目錄16個子目錄
key:中保存的是文件的路徑信息
例如基於md5提取校驗碼後存放的,分級存放,加快查找速度

實驗:fcgi緩存功能的實現
注:調用緩存時,至少應該制定三個參數
fastcgi_cache //指定緩存空間名稱
fastcgi_cache_key //把什麼當做key
fastcgi_cache_valid //緩存的對象,根據響應碼
vim /etc/nginx/nginx.conf

http {
    fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fcgicache:10m; //緩存的對應fs
    server {
        location ~ \.php$ {
            root /web/www/;
            fastcgi_cache fcgicache;
            fastcgi_cache_key $request_uri;

            fastcgi_cache_valid 200 300 10m;
            fastcgi_cache_valid 301 1h;

            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
            include fastcgi_params;
        }       
    }
}   

https://www.mt.com/info.php
ls /var/cache/nginx/fastcgi //會有很多目錄,緩存

參考博客:
<https://blog.51cto.com/freeloda/1288553&gt;;
<http://www.nginx.cn/doc/&gt;;
<http://nginx.org/en/docs/&gt;;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章