第十周
-
完成nginx编译安装脚本
#!/bin/bash NGINX_VERSION=1.22.1 NGINX_FILE=nginx-${NGINX_VERSION}.tar.gz NGINX_URL=http://nginx.org/download/ NGINX_INSTALL_DIR=/apps/nginx SRC_DIR=/usr/local/src CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'` . /etc/os-release color () { RES_COL=60 MOVE_TO_COL="echo -en \\033[${RES_COL}G" SETCOLOR_SUCCESS="echo -en \\033[1;32m" SETCOLOR_FAILURE="echo -en \\033[1;31m" SETCOLOR_WARNING="echo -en \\033[1;33m" SETCOLOR_NORMAL="echo -en \E[0m" echo -n "$1" && $MOVE_TO_COL echo -n "[" if [ $2 = "success" -o $2 = "0" ] ;then ${SETCOLOR_SUCCESS} echo -n $" OK " elif [ $2 = "failure" -o $2 = "1" ] ;then ${SETCOLOR_FAILURE} echo -n $"FAILED" else ${SETCOLOR_WARNING} echo -n $"WARNING" fi ${SETCOLOR_NORMAL} echo -n "]" echo } check () { [ -e ${NGINX_INSTALL_DIR} ] && { color "nginx 已安装,请卸载后再安装" 1; exit; } cd ${SRC_DIR} if [ -e ${NGINX_FILE}${TAR} ];then color "相关文件已准备好" 0 else color '开始下载 nginx 源码包' 0 wget ${NGINX_URL}${NGINX_FILE}${TAR} [ $? -ne 0 ] && { color "下载 ${NGINX_FILE}${TAR}文件失败" 1; exit; } fi } install () { color "开始安装 nginx" 0 if id nginx &> /dev/null;then color "nginx 用户已存在" 1 else useradd -s /sbin/nologin -r nginx color "创建 nginx 用户" 0 fi color "开始安装 nginx 依赖包" 0 if [ $ID == "centos" ] ;then if [[ $VERSION_ID =~ ^7 ]];then yum -y install gcc make pcre-devel openssl-devel zlib-devel perl-ExtUtils-Embed elif [[ $VERSION_ID =~ ^8 ]];then yum -y install make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed else color '不支持此系统!' 1 exit fi elif [ $ID == "rocky" ];then yum -y install gcc make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed else apt update apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev fi [ $? -ne 0 ] && { color "安装依赖包失败" 1; exit; } cd $SRC_DIR tar xf ${NGINX_FILE} NGINX_DIR=`echo ${NGINX_FILE}| sed -nr 's/^(.*[0-9]).*/\1/p'` cd ${NGINX_DIR} ./configure --prefix=${NGINX_INSTALL_DIR} --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module make -j $CPUS && make install [ $? -eq 0 ] && color "nginx 编译安装成功" 0 || { color "nginx 编译安装失败,退出!" 1 ;exit; } chown -R nginx.nginx ${NGINX_INSTALL_DIR} ln -s ${NGINX_INSTALL_DIR}/sbin/nginx /usr/local/sbin/nginx echo "PATH=${NGINX_INSTALL_DIR}/sbin:${PATH}" > /etc/profile.d/nginx.sh cat > /lib/systemd/system/nginx.service <<EOF [Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=${NGINX_INSTALL_DIR}/logs/nginx.pid ExecStartPre=/bin/rm -f ${NGINX_INSTALL_DIR}/logs/nginx.pid ExecStartPre=${NGINX_INSTALL_DIR}/sbin/nginx -t ExecStart=${NGINX_INSTALL_DIR}/sbin/nginx ExecReload=/bin/kill -s HUP \$MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true LimitNOFILE=100000 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now nginx &> /dev/null systemctl is-active nginx &> /dev/null || { color "nginx 启动失败,退出!" 1 ; exit; } color "nginx 安装完成" 0 } check install
-
完成nginx平滑升级,总结步骤
[root@ubuntu2004 ~]rz -E [root@ubuntu200406 ~]ls nginx-1.22.1 nginx-1.22.1.tar.gz nginx-1.24.0.tar.gz snap [root@ubuntu2004 ~]tar xf nginx-1.24.0.tar.gz [root@ubuntu2004 ~]ls nginx-1.22.1 nginx-1.22.1.tar.gz nginx-1.24.0 nginx-1.24.0.tar.gz snap [root@ubuntu2004 ~]cd nginx-1.24.0/ [root@ubuntu2004 nginx-1.24.0]ls auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src #查看当前使用的版本及编译选项。结果如下: [root@ubuntu2004 nginx-1.24.0]nginx -V nginx version: nginx/1.22.1 built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) built with OpenSSL 1.1.1f 31 Mar 2020 TLS SNI support enabled configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_modul
-
总结nginx核心配置,并实现nginx多虚拟主机
可以实现在一台服务器虚拟出多个网站。
子配置文件添加虚拟主机,在Nginx主配置文件nginx.conf中的http功能语句块内添加includ字段
include /apps/nginx/conf/conf.d/*.conf;
基于域名的多虚拟主机配置流程
server {
# 定义网站端口的参数
listen 80;
# 填写网站域名的参数
server_name www.test1.com;
#charset koi8-r;
#access_log logs/host.access.log main;
#access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;
location / {
# root关键词定义的是 网页根目录的路径
root /tmp/test/test1;
# index参数 定义的是首页文件的名字
index index.html index.htm;
}
}
server {
listen 80;
server_name www.test2.com;
location / {
root /tmp/test/test2/;
index index.html;
}
}
基于不同端口的虚拟主机配置
#第一个站点的配置,监听80端口
server {
#定义网站端口的参数
listen 80;
# 填写网站域名的参数
server_name localhost;
location / {
# root关键词定义的是 网页根目录的路径
root /etc/test/test3;
# index参数 定义的是首页文件的名字
index index.html;
}
}
第二个站点的配置,监听81端口
server {
listen 81;
server_name localhost;
location / {
root /etc/test/test4;
index index.html;
}
}
4.总结nginx日志格式定制
配置需要日志模块 ngx_http_log_module
的支持。 错误日志一般填写在location模块中,日志格式通过 log_format
命令来定义,ginx
日志相关的配置 包括 access_log
、rewrite_log
、error_log
。
log_format 指令
Nginx 预定义了名为 main 日志格式,如果没有明确指定日志格式将默认使用该格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
如果不想使用Nginx预定义的格式,可以通过log_format指令来自定义:
# 语法:
log_format name [escape=default|json] string ...;
name 格式名称。在 access_log 指令中引用。
escape 设置变量中的字符编码方式是json还是default,默认是default。
string 要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx变量。
下面是log_format指令中常用的一些变量:
$bytes_sent:发送给客户端的总字节数
$body_bytes_sent:发送给客户端的字节数,不包括响应头的大小
$connection:连接序列号
$connection_requests:当前通过连接发出的请求数量
$mses:日志写入时间,单位为秒,精度是毫秒
$pipe:如果请求是通过http流水线发送,则其值为“p”,否则为“.”
$request_length:请求长度
$request_time:请求处理时长
$status:响应状态码
$time_iso8601:标准格式的本地时间
$time_local:通用日志格式下的本地时间
$http_referer:请求的referer地址
$http_user_agent:客户端浏览器信息
$remote_addr:客户端IP
$http_x_forwarded_for:当前端有代理服务器时,记录web节点记录客户端地址的配置
$request:完整的原始请求行
$remote_user:客户端用户名称
$request_url:完整的请求地址
access_log
作用域
可以应用access_log指令的作用域分别有http,server,location,也就是说,在这几个作用域外使用该指令,Nginx会报错。
access_log /var/logs/nginx-access.log combined;
error_log
错误日志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息。
语法:
配置错误日志文件的路径和日志级别。
error_log file [level];
Default:
error_log logs/error.log error;
file 参数指定日志的写入位置。
level 参数指定日志的级别。level可以是debug, info, notice, warn, error, crit,alert,emerg中的任意值。可以看到其取值范围是按紧急程度从低到高排列的。只有日>志的错误级别等于或高于level指定的值才会写入错误日志中。
error_log /var/log/nginx/error.log;
配置段:http, mail, stream, server, location作用域。
例子中指定了错误日志的路径为:/var/log/nginx/error.log,日志级别使用默认的 error。
rewrite_log
由ngx_http_rewrite_module模块提供的。用来记录重写日志的。对于调试重写规则建议开启,启用时将在error log中记录重写日志。
rewrite_log on | off;
默认值:
rewrite_log off;
配置段: http, server, location, if作用域。
5.总结 nginx反向代理及https安全加密
反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
Nginx反向代理模块的指令是由ngx_http_proxy_module
模块进行解析
proxy_pass 该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式
proxy_set_header 该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器
proxy_redirect 该指令是用来重置头信息中的"Location"和"Refresh"的值
反向代理单台 Web 服务器
[root@centos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.test.org;
location / {
proxy_pass http://10.0.0.18/;
proxy_set_header Host $http_host; #转发主机头至后端服务器
proxy_connect_timeout 10s;
}
}
nginx -s reload #重启Nginx 并访问测试
Http 反向代理负载均衡
Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
http upstream 配置参数
范例:
## Basic reverse proxy server ##
upstream backend {
server 127.0.0.1:8080; # local server
}
server {
location / {
proxy_pass http://backend;
}
}
实现负载均衡
[root@centos8 ~]#vim /apps/nginx/conf.d/proxy.conf
upstream websrvs {
server 10.0.0.101:80 ;
server 10.0.0.102:80 ;
}
server {
listen 80;
server_name www.test.org;
return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name www.wang.org;
ssl_certificate /apps/nginx/ssl/www.wang.org.pem;
ssl_certificate_key /apps/nginx/ssl/www.wang.org.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
location / {
proxy_pass http://websrvs;
proxy_set_header Host $http_host;
}
}
[root@ubuntu2204 conf.d]#vim www.test.org.conf
upstream webservers{
server 10.0.0.201;
server 10.0.0.202;
}
server {
listen 80;
listen 443 ssl;
server_name www.wang.org;
root /data/nginx/html/pc;
ssl_certificate /apps/nginx/conf/conf.d/ssl/www.wang.org.pem ;
ssl_certificate_key /apps/nginx/conf/conf.d/ssl/www.wang.org.key ;
access_log logs/www.wang.org-access.log main;
location / {
proxy_pass http://webservers;
proxy_set_header host $http_host;
#root /data/nginx/html/pc;
index index.html;
if ($scheme = http ) {
#return 302 https://$server_name$request_uri;
rewrite ^/(.*) https://$server_name/$1 redirect;
}
}
}
1.https简介
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据
2.https协议原理
首先,客户端与服务器建立连接,各自生成私钥和公钥,是不同的。服务器返给客户端一个公钥,然后客户端拿着这个公钥把要搜索的东西加密,称之为密文,并连并自己的公钥一起返回给服务器,服务器拿着自己的私钥解密密文,然后把响应到的数据用客户端的公钥加密,返回给客户端,客户端拿着自己的私钥解密密文,把数据呈现出来
需要http_ssl_module模块支持
证书和私钥的生成
#自签名CA证书
[root@centos8 ~]# cd /apps/nginx/
[root@centos8 nginx]# mkdir certs
[root@centos8 nginx]# cd certs/
[root@centos8 nginx]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout
ca.key -x509 -days 3650 -out ca.crt #自签名CA证书
Generating a 4096 bit RSA private key
.................++
.....
Country Name (2 letter code) [XX]:CN #国家代码
State or Province Name (full name) []:BeiJing #省份
Locality Name (eg, city) [Default City]:Beijing #城市名称
Organization Name (eg, company) [Default Company Ltd]:wang.Ltd #公司名称
Organizational Unit Name (eg, section) []:wang #部门
Common Name (eg, your name or your server's hostname) []:ca.wang.org #通用名称
Email Address []: #邮箱
[root@centos8 certs]# ll ca.crt
-rw-r--r-- 1 root root 2118 Feb 22 12:10 ca.crt
#自制key和csr文件
[root@centos8 certs]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout
www.wang.org.key -out www.wang.org.csr
Generating a 4096 bit RSA private key
........................................................................++
......
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BeiJing
Locality Name (eg, city) [Default City]:BeiJing
Organization Name (eg, company) [Default Company Ltd]:wang.org
Organizational Unit Name (eg, section) []:wang.org
Common Name (eg, your name or your server's hostname) []:www.wang.org
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@centos8 certs]# ll
total 16
-rw-r--r-- 1 root root 2118 Feb 22 12:10 ca.crt
-rw-r--r-- 1 root root 3272 Feb 22 12:10 ca.key
-rw-r--r-- 1 root root 1760 Feb 22 12:18 www.wang.org.csr
-rw-r--r-- 1 root root 3272 Feb 22 12:18 www.wang.org.key
#签发证书
[root@centos8 certs]# openssl x509 -req -days 3650 -in www.wang.org.csr -CA
ca.crt -CAkey ca.key -CAcreateserial -out www.wang.org.crt
#验证证书内容
[root@centos8 certs]# openssl x509 -in www.wang.org.crt -noout -text
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
bb:76:ea:fe:f4:04:ac:06
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=BeiJing, L=Beijing, O=wang.Ltd, OU=wang,
CN=wang.ca/[email protected]
Validity
Not Before: Feb 22 06:14:03 2019 GMT
Not After : Feb 22 06:14:03 2020 GMT
Subject: C=CN, ST=BeiJing, L=BeiJing, O=wang.org, OU=wang.org,
CN=www.wang.org/[email protected]
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
#合并CA和服务器证书成一个文件,注意服务器证书必须在前,ca证书在后,否则会出错
[root@centos8 certs]#cat www.wang.org.crt ca.crt > www.wang.org.pem
配置文件
server {
listen 80;
listen 443 ssl http2;
server_name www.test.org;
ssl_certificate /apps/nginx/certs/www.test.org.pem;
ssl_certificate_key /apps/nginx/certs/www.test.org.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
root /data/nginx/html;
}
#重启Nginx并访问验证
标签:http,log,第十,--,server,nginx,root
From: https://www.cnblogs.com/meishijia8/p/18134549