Py008-10-06反向代理

反向代理介绍

客户机发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户端。

正向代理

1
代替用户上网,如长城宽带有很多代理服务器,你访问新浪的时候就会把这个内容缓存到代理服务器上,下次再有用户访问新浪的时候就不用直接去新浪了,直接去代理服务器

反向代理

1
2
3
4
5
6
7
代理服务器,就是把服务器发布出去。

如:买车 的4S店 它就是厂家的代理
你 ------> 4s店 ------> 汽车厂家

在以前没有4S店,你就只能去厂家下单提车,
如果有4S店,去4S店发起购买请求,然后下单,等待4S店把车拿来。

反向代理的好处

就4S店的例子

  • 对我们来说:4S店 让我们买车更方便,在家门口,而且不用应对海量用户。同时也是一个问题收集窗口(出了问题你肯定去4S店闹,不会去厂家)
  • 对厂家来说:可以专心生产汽车

应用场景

堡垒机场景

前段时间,汉某酒店的住户数据被盗了,用户数据泄漏

1
2
3
4
5
6
7
客户端--------> 反向代理服务器(公网)(堡垒机)-------->业务服务器(私网)


业务服务器:安全配置只接受来自堡垒机的链接访问,其他拒绝(客户端公网无法访问私网服务器)
只接收堡垒机ip和xx端口的访问

堡垒机:没有数据。防止拖库

内网服务器发布场景(就一个公网ip)

适用于公网IP地址不足的场景

1
2
3
4
            (虚拟主机的方式配置三个代理)
客户端--------> 反向代理服务器(公网)-------->业务服务器(私网) Php
|---------------> 业务服务器(私网) Java
|---------------> 业务服务器(私网) Python

缓存场景

1
2
3
4
5
6
7
客户端--------> 缓存服务器(公网)(缓存静态服务器)-------->业务服务器(私网)

静态数据直接从缓存服务器拿
动态数据从业务服务器拿

当用户访问一个网站时,就会瞬间得到静态数据,这个时候网站已经开始渲染了
动态数据可能过来慢一点,当渲染完静态数据时,动态数据也过来了。这个时候你就看到整个页面了
  • 一个页面你选择5s后一次返回结果
  • 还是你访问的时候数据不断的开始展示。(更好的用户体验,减小业务服务器压力)

反向代理原理

  1. 客户端通过浏览器器 发起请求 代理理服务器器
  2. 代理理服务器器 接受请求
  3. 代理理服务器器 发起请求 业务服务器器
  4. 业务服务器器 接受请求
  5. 业务服务器器 处理理请求
  6. 业务服务器器 响应请求 代理理服务器器
  7. 代理理服务器器 响应请求 客户端
  8. 客户端通过浏览器器渲染请求并展示给⽤用户

反向代理实践

1
2
3
4
5
client mac

反向代理 nginx

业务机器 book.ayitula.com http://118.190.209.153:4000/

前提保证你的nginx能上网,不然代理是不行的

  • proxy_pass配置 你的代理地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cd /usr/local/nginx/conf

# 备份配置
cp nginx.conf nginx.conf.2
cp nginx.conf.default nginx.conf

# 修改配置文件
vi nginx.conf

location / {
# 代理的ip地址
proxy_pass http://118.190.209.153:4000/;
}


# 杀掉nginx进程
killall nginx
# 重启nginx
/usr/local/nginx/sbin/nginx

# 访问你的服务器ip就ok了

优化反向代理的配置

proxy_set_header设置请求头

  • 你访问代理的时候所有请求信息都在 代理服务器,对于代理服务器的日志它能知道谁访问了它
  • 但是对于 业务服务来说,只知道是代理服务器访问了,如果想知道 客户端是谁就要设置请求头 来告诉业务服务器是谁拿的数据
1
2
3
4
5
6
设置
proxy_set_header X-Real-IP
proxy_set_header X-Forwarded-For
是因为不同厂家 设置的头不一样
有的针对 X-Real-IP 有的针对 X-Forwarded-For 提取用户
都加上就能满足所有需求

####

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location / {
index index.php index.html index.htm; #定义⾸首⻚页索引⽂文件的名称
proxy_pass http://mysvr ;#请求转向mysvr 定义的服务器器列列表 proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最⼤大单⽂文件字节数
client_body_buffer_size 128k; #缓冲区代理理缓冲⽤用户端请求的最⼤大字节数, proxy_connect_timeout 90; #nginx跟后端服务器器连接超时时间(代理理连接超时)
#后端服务器器数据回传时间(代理理发送超时) #连接成功后,后端服务器器响应时间(代理理接收超时) #设置代理理服务器器(nginx)保存⽤用户头信息的缓冲区⼤大⼩小
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k; #⾼高负荷下缓冲⼤大⼩小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存⽂文件夹⼤大⼩小,⼤大于这个值,将从upstream服务器器传
}

Py008-10-05虚拟主机

虚拟主机

  • 一个web服务器器软件默认情况下只能发布⼀一个web,因为⼀个web分享出去需要三个条件(IP、Port、Domain name)
  • 一个web服务器器软件如何发布多个web呢?
  • 虚拟主机:就是把一台物理理服务器器划分成多个“虚拟”的服务器器,每一个虚拟主机都可以有独⽴立的域名和独⽴立的⽬目录

同时发布两个网站

  • DocumentRoot /usr/local/nginx/html/web1
  • DocumentRoot /usr/local/nginx/html/web2

基于IP的虚拟主机

  • 两个ip
  • 两个DR(document root)
  • 索引页面 index.html 用来区分 两个ip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 192.168.10.42:80;
location / {
root html/web1;
index index.html index.htm index.php;
}
}
server {
listen 192.168.10.52:80;
location / {
root html/web2;
index index.html index.htm;
}
}

备份你的 nginx.conf

1
2
3
4
5
6
7
8
cd /usr/local/nginx/conf
cp nginx.conf nginx.conf1
#新生成一个 配置文件 用系统默认的
cp nginx.conf.default nginx.conf

# 删除 配置里无用的注释 和空行
sed -i "/#/d" nginx.conf
sed -i "/^$/d" nginx.conf

修改配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
worker_processes  1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

server {
listen 110.90.10.30:80;
# server_name localhost;
location / {
root html/web1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 110.90.10.50:80;
# server_name localhost;
location / {
root html/web2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
  • 110.90.10.30; 是我瞎写的一个 ip代表你买的服务器分配的ip
  • 110.90.10.50; 代表你开启
1
2
3
4
5
6
7
# 通过 ifconfig查看你的ip 就是 inet后面的
如 110.90.10.30

# 添加子网卡
ifconfig ens33:1 110.90.10.50/24 up

# 查看是否生成子网卡 ifconfig

新建根目录 index.html

1
2
3
4
mkdir /usr/local/nginx/html/web1
mkdir /usr/local/nginx/html/web2
echo web001 > /usr/local/nginx/html/web1/index.html
echo web002 > /usr/local/nginx/html/web2/index.html

查看是否启动

1
2
3
4
5
6
7
8
9
10
11
12
13
killall nginx
/usr/local/nginx/sbin/nginx

# 查看是否启动
netstat -ntpl

# 检查是否有内容
elinks http://110.90.10.30 --dump
elinks http://110.90.10.50 --dump


# 关闭子网卡
ifconfig ens33:1 down

基于端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
# server_name localhost;
location / {
root html/web1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8080;
# server_name localhost;
location / {
root html/web2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

IP和端口的区别

每个网站都需要一个IP

缺点:需要多个IP ,如果是公网IP 每个都要花钱

基于端口的

  • 只需要一个IP

缺点:端口你是无法告诉公网用户的,无法适用于公网用户 或者内部用户

如:某些网站就是 频繁的更换端口和IP 注意!违法的事咱不干

基于域名的虚拟主机

  • 域名是需要花钱的
  • 但是你本地可以手动改host
1
2
3
4
5
6
7
# 编辑你的hosts文件
vi /etc/hosts
你的IP www.abc.com
你的IP www.ccc.com

45.77.47.0 www.abc.com
45.77.47.0 www.ccc.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
server_name www.abc.com;
location / {
root html/web1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.ccc.com;
location / {
root html/web2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

查看是否成功

1
2
3
elinks http://www.abc.com --dump

elinks http://www.ccc.com --dump

Py008-10-04nginx入门

nginx默认网站

当Nginx配置文件里 有且仅有一个 Server 的时候,该server就被nginx认为是默认网站,所有发送给nginx服务器80端口的数据都会默认给 该Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
# 虚拟主机使用的端口
listen 80;
# 虚拟主机域名
server_name localhost;

# 字符集
#charset koi8-r;

# 虚拟主机的访问日志路径 如果你不设置 就会使用全局的日志
#access_log logs/host.access.log main;

# 定义web根路径
location / {
# 根目录路径
root html;
index index.html index.htm;
}

# 错误路径
#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
# 根据错误码 返回对应页面
error_page 500 502 503 504 /50x.html;
# 定义页面路径
location = /50x.html {
root html;
}
}

nginx 目录访问控制

如果你的其他电脑访问不到请关闭防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
https://blog.csdn.net/cool_summer_moon/article/details/78744009

# 查看默认防火墙状态(关闭后显示not running,开启后显示running)
firewall-cmd --state

# 开启防火墙
systemctl start firewalld.service

# 关闭防火墙:
systemctl stop firewalld.service

# 重启防火墙
systemctl restart firewalld.service
1
2
3
4
5
6
7
8
9
# 去nginx 的网站根目录
cd /usr/local/nginx/html
# 新建三个目录 a b c
mkdir a
mkdir b
mkdir c
echo a > c/index.html
echo b > b/index.html
echo c > c/index.html

修改nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log logs/host.access.log main;

# 定义web根路径
location / {
# 根目录路径
root html;
index index.html index.htm;
}

# 对a路径的范围设置
location /a {
# 允许个别
allow localhost;
allow 你本机ip
# 拒绝所有
deny all;
# 迷惑别人
# return 404;
# 还可以返回京东
return http://www.jd.com;
}

# 错误路径
#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
# 根据错误码 返回对应页面
error_page 500 502 503 504 /50x.html;
# 定义页面路径
location = /50x.html {
root html;
}
}

不要太粗暴的重启nginx

1
2
3
4
5
6
7
8
9
10
# 杀掉nginx进程
killall nginx
# 此时不要这样
# /usr/local/ngin/sbin/nginx 直接启动

# 应该先检查配置文件是否正确
/usr/local/ngin/sbin/nginx /usr/local/ngin/conf/nginx.conf

# 直接重新加载配置文件的方法
killall -s HUP nginx

访问验证,需要登录

auth_basic

  • 语法 auth_basic string | off;
  • 默认值 auth_basic off;

auth_basic_user_file file;

1
2
3
4
5
6
7
8
9
# 目录用户验证:任何人都可以访问,但是需要用户密码才能访问
location /b {
auth_basic "hjx的登录验证唯一性(加点料)dfsdafsdafk321kj3h12";
auth_basic_user_file /etc/nginx/htpasswd;
}


# 解释 这个是你放账号密码的文件
# /etc/nginx/htpasswd

此时账号密码还没有(而且对应/etc/nginx/htpasswd目录也没有你需要建立目录)

生成账号密码

  • htpasswd
  • openssl 默认应该有
1
2
# 安装
yum -y install httpd-tools

建立目录文件

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir /etc/nginx/htpasswd

vi /etc/nginx/htpasswd
# 输入如下内容
sko:123456

# 重启nginx
killall -s HUP nginx

# 然后访问 http://xx.xx.xx.xx/b 目录
输入账号 sko
输入密码 123456
# 还是失败 ! 因为你没有加密

加密两种方式

  • htpasswd
  • openssl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 如果你没有那个加密的文件 以及对应的目录 
htpasswd -c /etc/nginx/htpasswd 用户名
# 回车
输入你的密码 回车
再次输入你的密码 回车

# 如果你有那个文件 你就
htpasswd -m /etc/nginx/htpasswd 用户名
# 回车
输入你的密码 回车
再次输入你的密码 回车

编辑你的 /etc/nginx/htpasswd 因为刚才还存留上次的 sko:123456 删掉这行


# 此时你就可以输入密码后 访问 b目录了

日志格式

Nginx 访问日志主要有两个参数控制

  1. log_format #⽤用来定义记录⽇日志的格式(可以定义多种⽇日志格式,取不不同名字即可)
    log_format log_name string
  2. access_log #⽤用来指定⽇日⾄至⽂文件的路路径及使⽤用的何种⽇日志格式记录⽇日志
    access_log logs/access.log main

Log_format格式变量量

log_format格式变量量:

1
2
3
4
5
6
7
8
9
$remote_addr #记录访问⽹网站的客户端地址
$remote_user #远程客户端⽤用户名
$time_local #记录访问时间与时区
$request #⽤用户的http请求起始⾏行行信息
$status #http状态码,记录请求返回的状态码,例例如:200、301、404等
$body_bytes_sent #服务器器发送给客户端的响应body字节数
$http_referer #记录此次请求是从哪个连接访问过来的,可以根据该参数进⾏行行防盗链设置。
$http_user_agent #记录客户端访问信息,例例如:浏览器器、⼿手机客户端等
$http_x_forwarded_for #当前端有代理理服务器器时,设置web节点记录客户端地址的配置,此参数⽣生效的前提是代理理服务器器也要进⾏行行相关的x_forwarded_for设置

自定义日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;
# 自定义日志
# 自定义日志
# 自定义日志
log_format hjx_log '[$time_local] $remote_addr $request $status'


server{
# ...
# 此处指定 日志格式文件
access_log logs/host.access.log hjx_log

# ...
}
}

重启nginx

1
killall -s HUP nginx

去你的浏览器访问 你对应 ip的地址

查看日志是否生效

1
2
3
4
cat /usr/local/nginx/logs/host.access.log 

#或者 滚动输出
tailf /usr/local/nginx/logs/host.access.log

运维关心下json格式的日志定义

自定义日志格式为json

1
2
3
4
5
6
7
8
log_format main_json '{"@timestamp":"$time_local",' '"client_ip": "$remote_addr",'
'"request": "$request",'
'"status": "$status",'
'"bytes": "$body_bytes_sent",'
'"x_forwarded": "$http_x_forwarded_for",'
'"referer": "$http_referer"'
'}’;
access_log logs/access_json.log main_json;

nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;
# 自定义日志
# 自定义日志
# 自定义日志
log_format hjx_log '[$time_local] $remote_addr $request $status';
# json格式自定义日志
log_format main_json '{"@timestamp":"$time_local",' '"client_ip": "$remote_addr",'
'"request": "$request",'
'"status": "$status",'
'"bytes": "$body_bytes_sent",'
'"x_forwarded": "$http_x_forwarded_for",'
'"referer": "$http_referer",'
'}’;

server{
# ...
# 此处指定 日志格式文件
access_log logs/host.access.log main_json

# ...
}
}
  • json格式有问题 以后解决吧!!!!

防盗链

先上传到你的服务器一个图片

1
2
3
4
scp 本地文件路径 centos文件存放地路径

scp /Users/huangjiaxi/Desktop/aa.png root@xx.xx.xx.xx:/usr/local/nginx/html/c
```

c目录下

location /c {

宽广匹配 ~

* 代表不区分大小写

location ~* .(png|gif|bmp)$ {

# valid_referers none 代表用户直接访问的
# blocked 有防火墙标志的
# *.ayitula.com; 我自己的服务器域名下的
valid_referers none blocked *.ayitula.com; 
# 假如是非法 referer直接返回403
if ($invalid_referer) {
return 403;
} 

}
`

Py008-10-03nginx配置详解

nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
# 杀掉nginx进程
killall nginx
# 未找到命令
# 安装 yum -y install psmisc
# 如果你不知命令对应是那个包 你就
yum search killall

# 验证 端口是否占用
lsof -i :80

# 添加用户 www 不能登录只能启动程序
useradd -s /sbin/nologin -r www
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# 启动nginx子进程的默认用户
#user nobody;
# 一个主线程和多个工作进程。工作进程是单进程的,且不需要特殊授权即可运行,这里是定义工作进程数量
worker_processes 1;

# 全局错误日志的位置和日志格式
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
# 每个工作进程最大的并发数 就是线程
worker_connections 1024;
}


http {
# 设定mime类型,类型由 mime.types定义
include mime.types;
default_type application/octet-stream;

# 日志格式
# main代表日志名字
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# $remote_addr 和 $http_x_forwarded_for用来记录客户端ip
# $remote_user 记录客户端用户名称
# $time_local 记录访问时间和时区
# $request 记录请求的url和http协议
# $status 记录请求状态 成功是200
# $body_bytes_sent 记录发送给客户端文件主题内容大小
# $http_referer 记录从那个页面连接过来的
# $http_user_agent 记录客户浏览器相关信息

# 全局访问日志路径
#access_log logs/access.log main;

# 用来指定nginx是否调用 sendfile函数的zero copy模式来输出文件,对于普通应用,必须设置为 on
sendfile on;

# 运行或禁用 socke 的 TCP_CORK的选项, 此选项仅在 sendfile的时候使用
#tcp_nopush on;

# 连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;

# 开启压缩
#gzip on;

# 配置虚拟主机
server {
# 虚拟主机使用的端口
listen 80;
# 虚拟主机域名
server_name localhost;

# 字符集
#charset koi8-r;

# 虚拟主机的访问日志路径
#access_log logs/host.access.log main;

# 定义web根路径
location / {
# 根目录路径
root html;
index index.html index.htm;
}

# 错误路径
#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
# 根据错误码 返回对应页面
error_page 500 502 503 504 /50x.html;
# 定义页面路径
location = /50x.html {
root html;
}

# 定义反向代理服务器 数据服务器是lamp 模型
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# 定义php 为本机服务的模型
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
# 拒绝apache DR目录以及子目录下的 .htaccess 文件访问
#location ~ /\.ht {
# deny all;
#}
}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}


# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

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

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

# location / {
# root html;
# index index.html index.htm;
# }
#}

}

Py008-10-02nginx安装

前置工作(强烈建议买个服务器,省时省心)

  • 不要买国内 (备案又一堆国情限制)
  • https://www.vultr.com/ 去这个网站注册一个 充值10刀

购买服务器

  1. 登录 https://www.vultr.com/
  2. 选中左侧 Servers 进入 Servers页面
  3. 点击 蓝色按钮 “+” 选择一个服务器的位置
  4. 选择 服务器种类 CentOs 7x64
  5. Serve Size 建立选3.5刀的
  6. 添加你的ssh key 这样你本机如果有公钥 就可以免密登录
  7. Server Hostname & Label 填个 test
  8. deploy now 开始帮你部署
  9. Running 代表你的机器部署好了

如果选错了 或者觉得机器装的软件有问题 ,你可以选择销毁这个服务器 Server Destroy

选择你的服务器

  • IP Address 就是可以登录的ip
  • Username root 用户名
  • Password 登录的密码

远程登录服务器

  • 我的是mac 可以直接 命令行操作
  • 如果是window 请自行安装 xshell(建议5版本)
1
2
3
4
5
ssh root@45.32.35.132 
然后输入密码

如果你添加了 ssh key就可以不用密码 直接
ssh root@45.32.35.132

坑之ssh登录不上

  • 可能被墙了 推荐去 这个网站扫描一下测试一下 http://tool.chinaz.com/port/

  • 报超时

  • 错误(意思就是把你known_hosts 清空)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:IfqkeAv7S54WxWzUG1AwYW75Ihzc3WUyP3D2eiCvTpw.
Please contact your system administrator.
Add correct host key in /Users/huangjiaxi/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/huangjiaxi/.ssh/known_hosts:6
ECDSA host key for 45.77.47.0 has changed and you have requested strict checking.
Host key verification failed.

# 切换到你的 .ssh目录
/Users/huangjiaxi/.ssh/
把 known_hosts 里的内容清空

https://ningandjiao.iteye.com/blog/1517793

nginx获取

nginx 安装

源码安装三部曲
  • 配置
  • 编译
  • 安装

配置 configure

  • prefix=path 安装路径
  • –help 配置参数

编译

  • make

安装

  • make install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 远程登录你的服务器
# 如果你有 ssh key 就可以免密登录
ssh root@xxx.xx.xx.xx

# 查看 hostname
hostname

##### 下载nginx源码包
# 下载 nginx源码包 安装到 /usr/src 目录 是一个压缩包
wget http://www.nginx.org/download/nginx-1.15.5.tar.gz -P /usr/src
# 如果 提示没有 wget命令 你就
# yum -y install wget

# 查看是否下载内容大小
# du -h /usr/src/nginx-1.15.5.tar.gz

# 切换到源码包目录
cd /usr/src
# 解压源码包
tar xf nginx-1.15.5.tar.gz
# 查看当前目录文件
ls
debug kernels nginx-1.15.5 nginx-1.15.5.tar.gz

# 切换到 解压后的源码包目录
cd nginx-1.15.5
# ls有如下文件
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README


# configure 就类似 window下的exe文件
# 查看安装参数解释
./configure --help

# 指定nginx 安装路径
./configure --prefix=/usr/local/nginx

# 此时一定报错,因为你是最小化安装 ,所以源码需要一个编译器
# checking for OS
# + Linux 3.10.0-957.1.3.el7.x86_64 x86_64
# checking for C compiler ... not found
# ./configure: error: C compiler cc is not found

# 安装 cc编译器 gcc
# 后期nginx url重写的包 pcre-devel
# 解压缩的包 zlib zlib-devel
yum -y install gcc pcre-devel zlib zlib-devel

# 再次执行 configure命令 ,如果没有error安装成功 有error 一定要解决 不然后患无穷
./configure --prefix=/usr/local/nginx

# 编译源码 将源码变成可执行文件 没有error代表 成功
make

# 安装
make install

相关文件

  • 安装路径nginx path prefix : /usr/local/nginx
  • 启动文件nginx binary file: /usr/local/nginx/sbin/nginx
  • nginx模块 nginx modules path: /usr/local/nginx/modules
  • 配置文件目录 nginx configuration prefix: /usr/local/nginx/conf
  • 配置文件 nginx configuration file: /usr/local/nginx/conf/nginx.conf
  • 进程号文件 pid file: /usr/local/nginx/logs/nginx.pid
  • 错误日志 nginx error log file : /usr/local/nginx/logs/error.log
  • 访问日志 nginx http access log file: /usr/local/nginx/logs/access.log

nginx 启动

1
2
3
4
/usr/local/nginx/sbin/nginx 端口 监听地址 协议

# 直接这样是很冒险的 因为你不知道端口是不是占用了
/usr/local/nginx/sbin/nginx

查看端口有没有人占用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
lsof -i :80
# 如果提示没有 lsof命令 请安装
yum -y install lsof
或者

netstat -ntpl
# 如果提示没有 netstat命令 请安装
yum install net-tools
# 安装这个模块 后 ifconfig 命令也有了

# 查看nginx服务是否启动成功 安装命令行下的 文本浏览器 elinks
# yum -y install elinks
# 除此之外还有一个 curl
# 查看启动是否成功

elinks http://你的ip地址 --dump

Py008-10-01nginx介绍

nginx 介绍

nginx管理

  • 安装/启动
  • nginx相关目录配置
  • nginx默认网站
    • 访问控制
    • 日志管理
    • 防盗链
  • nginx 虚拟主机
  • 反向代理
  • URL重写
  • Nginx下载限速

Nginx优化

Nginx 负载均衡

Nginx 缓存

硬件配置

  • Vmware 虚拟机2核 4G
  • 网卡:桥接
  • 系统 Centos7.5
  • 关闭防火墙
  • Selinux 关闭
  • 网段 192.168.10.0/24

Py008-02-02数据结构之栈

栈 Stack

栈是一种数据集合,可以理解为只能在一端进行插入和删除操作的列表

栈的特点

  • 后进先出LIFO

栈的概念

  • 栈顶
  • 栈底

栈的基本操作

  • 进栈(压栈)push
  • 出栈 pop
  • 取栈顶 gettop

生活实例

  • 弹匣的 压子弹,取子弹

栈的简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Stack:
def __init__(self):
self.stack = []

def push(self,element):
self.stack.append(element)

def pop(self,element):
if len(self.stack) > 0:
return self.pop()
else:
return None
def get_top(self):
if len(self.stack) > 0 :
return self.stack[-1]

def is_empty(self):
return len(self.stack) == 0

栈的应用

括号匹配问题:给一个字符串,其中包括小括号,中括号,大括号,求该字符串中括号是否匹配

例如

1
2
3
4
()()[]{} 匹配
([{()}]) 匹配
[]( 不匹配
[(]) 不匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Stack:
def __init__(self):
self.stack = []

def push(self,element):
self.stack.append(element)

def pop(self,element):
if len(self.stack) > 0:
return self.pop()
else:
return None
def get_top(self):
if len(self.stack) > 0 :
return self.stack[-1]

def is_empty(self):
return len(self.stack) == 0

def brace_match(s):
match = {
'}':'{',
']':'[',
')':'('
}
stack = Stack()
for ch in s:
if ch in {'{','[','('}:
stack.push(ch)
else: # {'}',']',')'}
if stack.is_empty():
return False
elif stack.get_top() == match[ch]:
stack.pop()
else: # stack.get_top() != match[ch]
return False
if stack.is_empty():
return True
else:
return False

print(brace_match('[{({[]})}]'))
print(brace_match('[{]'))

Py008-02-01数据结构之列表

数据结构

相互之间存在一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成

  • 数据结构就是设计数据以何种方式组织并存储在计算机中。
  • 比如:列表/集合与字典等都是一种数据结构

数据结构的分类

  • 线性结构:数据结构中的元素存在一对一的相互关系
  • 树结构:数据结构中的元素存在一对多的相互关系
  • 图结构:数据结构中的元素存在多对多的相互关系

列表

  • 列表是如何存储的
  • 列表的下标查找,插入,删除操作的时间复杂度
  • python的列表是如何实现的

列表是如何存储的

  • 顺序存储,一块(一个接一个)连续的内存
1
2
3
4
5
6
7
32位机器上,一个整数四个字节32位
在c语言里的数组
arr = [1,2,3,4,5]
假设arr[0] 内存地址是100
整型变量占用4个字节
那么a[1] 的内存地址就是104
a[2] 的内存地址是 108 。。。

数组和列表两点不同

  • 数组元素类型要相同
  • 数组长度固定

通过li[index]的寻址过程和处理数组内数据类型不同问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
python中列表
li = [1,2,3]
针对常用的小整数python直接分配固定的内存
假设分配的addr
1 addr = 200
2 addr = 305
3 addr = 500
那么 li = [1,2,3]
32位机器上,一个整数四个字节32位
假设li[0] 的地址为 100 它里面存的是1的内存地址200
假设li[1] 的地址为 104 它里面存的是1的内存地址305
假设li[2] 的地址为 108 它里面存的是1的内存地址500

这就是python列表解决 类型不同的问题

如何解决数组动态添加元素的问题

1
内存动态分配

append的时间复杂度

1
O(1)

插入和删除的时间复杂度

  • O(n)
1
2
3
4
5

[1,2,3,4,5,6]
删除第一个元素
1后面的元素都要把地址向前迁移一位
[2,3,4,5,6]

Py008-01-12NB三人组总结

总结

综合数据

#### 空间复杂度

  • 快排和归并里有递归(递归需要压栈所有需要一定的空间)

稳定性

  • 挨个换 冒泡 插入 归并
  • 跳着换 选择 快排 堆排序

Py008-01-11归并排序之归并

归并排序——归并

假设现在有一个列表 分两段有序,如何将其合并成一个有序列表

1
如[2,5,7,8,9|华丽的分割线|1,3,4,6]
  • 这种操作称为一次归并
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
res = []
两个列表分别取第一个
[2,5,7,8,9]
[1,3,4,6]
2>1 1出来 res = [1]
[2,5,7,8,9]
[3,4,6]
2<3 2出来 res = [1,2]
[5,7,8,9]
[3,4,6]
5>3 3出来 res = [1,2,3]
[5,7,8,9]
[4,6]
5>4 4出来 res = [1,2,3,4]
[5,7,8,9]
[6]
5<6 5出来 res = [1,2,3,4,5]
[7,8,9]
[6]
7>6 6出来 res = [1,2,3,4,5,6]
[7,8,9]
[]
[7,8,9] 都出来 res = [1,2,3,4,5,6,7,8,9]

代码实现

  • 大前提:两段有序的归并
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def merge(li,low,mid,high):
i = low # 第一个列表起点
j = mid+1 # 第二个列表起点
ltmp = [] # 没法用到原地排序了
while i<=mid and j<=high:# 只要左右两边都有数
if li[i] < li[j]:
ltmp.append(li[i])
i += 1
else:
ltmp.append(li[j])
j += 1

# while执行完了,肯定有一头 没数了
while i <= mid:
ltmp.append(li[i])
i += 1
while j <= high:
ltmp.append(li[j])
j += 1
li[low:high+1] = ltmp

li = [2,4,5,7,1,3,6,8]
merge(li,0,3,7)
print(li)

归并排序——使用归并

  • 分解:将列表越分越小,直至分成一个元素
  • 终止条件:一个元素是有序的
  • 合并:将两个有序列表归并,列表越来越大。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def merge(li,low,mid,high):
i = low # 第一个列表起点
j = mid+1 # 第二个列表起点
ltmp = [] # 没法用到原地排序了
while i<=mid and j<=high:# 只要左右两边都有数
if li[i] < li[j]:
ltmp.append(li[i])
i += 1
else:
ltmp.append(li[j])
j += 1

# while执行完了,肯定有一头 没数了
while i <= mid:
ltmp.append(li[i])
i += 1
while j <= high:
ltmp.append(li[j])
j += 1
li[low:high+1] = ltmp


def merge_sort(li,low,high):
if low < high:#至少有两个元素,递归
mid = (low + high)//2
merge_sort(li,low,mid)
merge_sort(li,mid+1,high)
merge(li,low,mid,high)

li = list(range(16))
import random
random.shuffle(li)
print(li)
merge_sort(li,0,len(li)-1)
print(li)

归并排序复杂度

时间复杂度

  • O(nlogn)

空间复杂度

  • O(n) 因为不是原地排序需要单独开辟空间