搭建時間服務器,日誌服務器並簡述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>;
<http://www.nginx.cn/doc/>;
<http://nginx.org/en/docs/>;