老男孩教育61期--week15--网站web服务
-
课程介绍部分:
- 网站web服务扩展应用说明
a 网站状态模块配置说明
b 网站日志信息详细说明
d 网站location配置说明
e 网站服务跳转功能配置
f 网站服务如何安全访问 HTTPS
2)网站LNMP架构
a LNMP架构搭建配置
b LNMP架构代码上线 jenkins
负载均衡/高可用
- 网站web服务扩展应用说明
-
知识重点回顾:
- nginx网站服务概念介绍
a 高并发消耗资源少
b 功能丰富 - nginx网站服务部署安装
yum安装 (官方源安装 非官方源安装)
编译安装 (源码包 依赖软件 配置参数) - nginx网站服务目录结构
/etc/nginx /var/log/nginx /html /usr/bin/ - nginx网站服务配置文件 (默认信息)
多参见官方网站资料 - nginx网站服务应用配置
a 实现部署多个网站页面
b 实现不同方式访问网站
c 实现网站服务目录索引
d 实现网站安全访问功能
根据地址控制 根据认证控制(401)
- nginx网站服务概念介绍
-
nginx网站服务企业应用
1)nginx服务监控状态页部署
第一个历程:创建一个新的server虚拟主机
vim conf.d/state.conf
server {
listen 80;
server_name state.oldboy.com;
location / {
stub_status;
}
}
第二个历程:创建域名解析
state.oldboy.com 10.0.0.7监控状态页面信息:
Active connections: 2
server accepts handled requests
2 2 1
Reading: 0 Writing: 1 Waiting: 1Active connections: 激活的连接数(总的并发连接数)
server accepts: 已经接收的客户端访问服务端总的链接数量
handled: 已经处理的客户端访问服务端总的链接数量
requests: 接收到用户请求报文的总数量Reading: 目前读取用户访问请求头数量
Writing: 目前响应用户访问响应头数量
waiting: 目前在内存/队列中未处理请求报文数量
http://nginx.org/en/docs/http/ngx_http_stub_status_module.html2)nginx服务日志信息
access 访问日志: /var/log/nginx/access.log
log_format main 'remote_user [request" '
'body_bytes_sent "http_user_agent" "remote_addr 10.0.0.1 用户访问源地址信息
time_local] [20/Jul/2019:10:31:52 +0800] 用户访问网站时间信息
status 404 显示状态码信息
http_referer ???
http_x_forwarded_forerror 错误日志:/var/log/nginx/access.log
配置方法:
error_log /var/log/nginx/error.log warn;
http://nginx.org/en/docs/ngx_core_module.html#error_log
2019/07/20 10:31:52 [error] 11763#11763: *6 open() "/html/www/favicon.ico" failed (2: No such file or directory), client: 10.0.0.1, server: www.oldboy.com, request: "GET /favicon.ico HTTP/1.1", host: "www.oldboy.com", referrer: "http://www.oldboy.com/"
3) 网站服务location配置
http://nginx.org/en/docs/http/ngx_http_core_module.html#location
location [ = | ~ | ~* | ^~ ] uri { ... }
location: 局部配置
server: 全局配置
location = / {
return 301;
}
location / {
return 302;
}
location /documents/ {
return 401;
}
location ^~ /images/ {
return 402;
}
location ~* \.(gif|jpg|jpeg)$ {
return 501;
}
=: 精确匹配 = /oldboy www.oldboy.com/oldboy 最优先
^~: 优先匹配 ^~ /images www.oldboy.com/images/oldboy.jpg 优先
~: 模糊匹配 ~ /oldboy www.oldboy.com/oldboy/oldboy.html 区分大小写
~*: 模糊匹配 ~* /oldboy www.oldboy.com/oldboy/oldboy.html 不区分大小写
~* \.(gif|jpg|jpeg)$ www.oldboy.com/images/oldboy.jpg
/目录 路径匹配 /oldboy www.oldboy.com/oldboy/oldboy.html 区分大小写
/ 默认匹配 / www.oldboy.com/oldgirl
异常问题:
第一步: www.oldboy.com/ ---> location / --> www.oldboy.com/oldboy.jpg
第二步: www.oldboy.com/oldboy.jpg ---> location = /oldboy --> www.oldboy.com/oldboy.jpg
4) 网站服务页面跳转功能
什么是页面跳转:
1. 将url信息做改变
2. 将uri信息做改变
3. 完成伪静态配置 动态页面地址--看到的静态页面???
如何实现页面跳转:
方法一:rewrite
Syntax: rewrite regex replacement [flag];
匹配需要跳转的信息 跳转成什么地址 标记
Default: —
Context: server, location, if
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
跳转的标记信息:
last:
break:
redirect: 临时跳转 302
permanent: 永久跳转 301
301跳转:
客户端(浏览器) ----> 京东网站服务器(.100)
www.360buy.com HTTP请求:host-www.360buy.com
10.0.0.100 <----
HTTP响应:跳转告知 www.jx.com 301
告知浏览器记录跳转
---->
HTTP请求:host-www.jd.com
<----
HTTP响应:页面信息进行响应 200
---> 京东网站服务器(.100)
www.360buy.com HTTP请求:host-www.360buy.com
HTTP请求:host-www.jd.com
<---
HTTP响应:页面信息进行响应 200
302跳转
客户端(浏览器) ----> 京东网站服务器(.100)
www.360buy.com HTTP请求:host-www.360buy.com
10.0.0.100 <----
HTTP响应:跳转告知 www.jd.com 302
---->
HTTP请求:host-www.jd.com
<----
HTTP响应:页面信息进行响应 200
---> 京东网站服务器(.100)
www.360buy.com HTTP请求:host-www.360buy.com
<----
HTTP响应:跳转告知 www.jd.com 302
---->
HTTP请求:host-www.jd.com
<----
HTTP响应:页面信息进行响应 200
方法二:return 配置简单方便
Syntax: return code URL;
Default: —
Context: server, location, if
www.jd.com/oldboy.html --- return 301 www.jx.com/oldboy.html
页面跳转实践操作:
01. 跳转配置中last与break区别对比示例
server {
listen 80;
server_name rewrite.oldboy.com;
root /html;
index index.html;
location ~ ^/break/ {
rewrite ^/break/ /test/ break; --- 有跳转目录吗 有首页文件
}
location ~ ^/last/ {
rewrite ^/last/ /test/ last; --- 不需要必须有跳转目录吗 不需要有首页文件
}
location /test/ {
default_type application/json;
return 200 'ok';
}
}
break:一旦跳转完毕,默认停止后续操作(没有相应信息) 不会再地址栏显示跳转页面地址
last: 一旦跳转完毕,会继续访问页面配置信息
03. 常见跳转示例情况测试说明
例1: 用户访问/abc/1.html实际上真实访问是/ccc/bbb/2.html
#http://rewrite.oldboy.com/abc/1.html ==> http://rewrite.oldboy.com/ccc/bbb/2.html
实现uri信息跳转
/html/abc/1.html 收藏夹
第一里程:准备真实的访问路径
[root@web03 ~]# mkdir /html/ccc/bbb -p
[root@web03 ~]# echo "ccc_bbb_2" > /html/ccc/bbb/2.html
第二个里程:Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf
server {
listen 80;
location / {
root /html;
index index.html;
}
location /abc {
rewrite (.*) /ccc/bbb/2.html redirect;
#return 302 /ccc/bbb/2.html;
}
}
第三个里程:重启Nginx服务
[root@web03 ~]# systemctl restart nginx
例2:用户访问/2014/ccc/bbb/2.html实际上真实访问是/2018/ccc/bbb/2.html
#http://rewrite.oldboy.com/2014/ccc/bbb/2.html ==> http://rewrite.oldboy.com/2018/ccc/bbb/2.html
第一个里程:准备真实的访问路径
[root@web03 ~]# mkdir /html/2018/ccc/bbb -p
[root@web03 ~]# echo "2018_ccc_bbb_2" > /html/2018/ccc/bbb/2.html
第二个里程:Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf
server {
listen 80;
location / {
root /code;
index index.html;
}
location /2014 {
rewrite ^/2014/(.*)$ /2018/$1 redirect;
#return 302 /2018/ccc/bbb/2.html;
}
}
第三个里程:重启Nginx服务
[root@web03 ~]# systemctl restart nginx
例3:用户访问/test目录下任何内容, 实际上真实访问是http://www.oldboy.com
准备环境:
mkdir /html/test/ oldboy.jpg
配置
location /test {
rewrite (.*) http://rewrite.oldboy.com redirect;
}
location / {
root /html;
index oldboy.jpg index.html;
}
例4:用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
#http://www.oldboy.com/course-11-22-33.html ==> http://www.oldboy.com/course/11/22/33/course_33.html
跳转目的,不要让用户得知企业站点目录结构
第一个里程 准备真实的访问路径
[root@web03 ~]# mkdir /html/course/11/22/33/ -p
[root@web03 ~]# echo "Curl docs.etiantian.org" > /html/course/11/22/33/course_33.html
第二个里程 Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf
server {
listen 80;
root /code;
index index.html;
location / {
#灵活rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
#固定rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
}
第三个里程 重启Nginx服务
[root@web03 ~]# systemctl restart nginx
说明: last break 做跳转不会显示跳转的地址信息
例5:将http请求,跳转至https
如何部署HTTPS网站:
第一个历程:环境准备工作
安装nginx程序时,需要开启ssl模块功能() --with-http_ssl_module
第二个历程:配置文件中加载ssl配置信息
http://nginx.org/en/docs/http/ngx_http_ssl_module.html
server {
listen 443 ssl;
server_name rewrite.oldboy.com;
ssl_certificate /etc/nginx/server.crt; 公钥
ssl_certificate_key /etc/nginx/server.key; 私钥
}
解释说明:
为什么HTTPS访问需要有公钥和私钥:
www.jd.com(真) ---- 公钥 --- 浏览器(公钥--www.jd.com)
私钥(真) 公钥(真)
www.jd.com(假)
私钥(假) 公钥(真)
www.jd.com(真) 浏览器(公钥--www.jd.com)
私钥(真) 公钥(真)
www.jd.com(假)
私钥(假) 公钥(真)
CA 证书颁发机构
第三个历程: 创建私钥和证书
先有私钥:
openssl genrsa -idea -out server.key 2048
私钥密码
创建证书:
openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
-days 36500 --- 设置证书时效
-x509 --- 设置证书文件信息格式
-sha256 --- 证书数据加密方式
-nodes -newkey --- 去掉密码信息
rsa:2048 --- 识别私钥加密信息
-keyout --- 读取私钥文件
-out --- 输出一个证书
第四个历程:重启nginx服务,进行测试
第五个历程:实现http跳转为HTTPs
server {
listen 80;
server_name rewrite.oldboy.com;
rewrite ^(.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri; ???
}
rewrite.oldboy.com/oldboy.jpg ---> https://rewrite.oldboy.com/oldboy.jpg
rewrite ^(.*) $scheme://rewrite.oldboyedu.com$request_uri redirect;
https://rewrite.oldboy.com/oldboy.jpg ---> https://rewrite.oldboyedu.com/oldboy.jpg
server {
listen 443 ssl;
server_name rewrite.oldboy.com;
ssl_certificate /etc/nginx/server.crt; 公钥
ssl_certificate_key /etc/nginx/server.key; 私钥;
}
Rewrite常用内置变量,在匹配过程中可以引用一些Nginx的全局变量
$server_name 当前用户请求的域名
$request_filename 当前请求的文件路径名(带网站的主目录/html/images/test.jpg)
$request_uri 当前请求的文件路径名(不带网站的主目录/images/test.jpg)
$scheme 用的协议,比如http或者https
实际配置:
[root@web01 nginx]# cat /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name rewrite.oldboy.com;
rewrite ^(.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name rewrite.oldboy.com;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
location / {
root /html;
index index.html index.htm;
}
}
以上都是实现uri信息跳转
实现url信息跳转:rewrite.oldboy.com --- www.jd.com
第一个历程:配置好解析信息
10.0.0.7 rewrite.oldboy.com rewrite.oldboyedu.com
第二个历程:编写配置文件
编写方法一:
[root@web01 conf.d]# cat rewrite.conf
server {
listen 80;
server_name rewrite.oldboy.com;
rewrite ^/(.*) http://www.jd.com/$1 permanent;
}
server {
listen 80;
server_name www.jd.com;
location / {
root /html;
index index.html index.htm;
}
}
编写方法二:
location / {
root /html;
index index.html index.htm;
if ($http_host ~* ^rewrite.oldboy.com) {
rewrite ^/(.*) http://www.jd.com/$1 permanent;
}
}
-
nginx网站服务阶段总结:
软件部署安装过程
软件配置文件编写
http://nginx.org/en/docs/-
软件企业应用配置
a. 实现多个页面配置
b. 实现不同访问方式
c. 实现目录索引功能
d. 实现网站安全访问
e. 实现状态信息监控
f. 服务程序日志功能 日志切割处理(logrotate 切割日志脚本)!/bin/bash
log_path="/var/log/nginx/"
access_info="access_log"
error_info="error_log"
access_info_date="access_(date +%F).log"mv access_info access_info_date
mv error_info error_info_date
systemctl restart nginx
编写定时任务
g. 服务程序location匹配uri信息功能
h. 服务程序rewrite(return)实现网站页面跳转功能 网站服务实现HTTPs访问
-
网站LNMP架构
web01: 处理静态请求 nginx
架构组成部分
L: linux (selinux没关 防火墙关闭 /tmp 1777)
n: nginx web服务功能
p: php
M: mysql(mariadb) 数据库LNMT:
n: nginx 负载均衡功能
t: tomcat
LNMP:
p: python
架构功能原理:
用户访问网站(静态) --- nginx
用户访问网站(动态) --- nginx --- php --- mariadb(查/写) -
网站LNMP搭建过程:
第一个历程: 软件安装部署 OKmariadb: 安装部署
yum install -y mariadb-server mariadbPHP: 安装部署
yum remove php-mysql php php-fpm php-common
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install -y php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb第二个历程: 软件配置 测试过程
nginx + php 建立关系
php + mysql 建立关系 (代码信息)
第三个历程: 手动代码上线
代码使用开源代码:
blog 博客: wordpress
www 网站: dedecms
bbs 论坛: discuz
zhihu 知乎: wecenter云主机: 1台 域名:(备份) ssl证书: 免费 高并发: CDN
nginx-不能yum安装(编译安装)第四个历程: 数据库迁移过程
第五个历程: 实现数据共享存储
作业:
- LNMP架构服务软件部署好
- 负载均衡 / 高可用
lb01 lb02 --- nginx keepalived