部署python、灰度发布、网站限流限速、Nginx实现跨域
一、部署python
安装python依赖软件
```shell
yum -y install gcc make python3 python3-devel
```
安装python网站的依赖包,python的软件包使用pip3安装
```shell
pip3 install pytz-2022.6-py2.py3-none-any.whl
pip3 install Django-1.11.8-py2.py3-none-any.whl
pip3 install django-bootstrap3-11.0.0.tar.gz
```
测试
```shell
python3 manage.py runserver 0.0.0.0:8000 #manage.py网站运行的引导文件
```
<img src="LINUXNSD_V01OPERATIONDAY04_005.png" style="zoom:50%;" />
安装uWSGI
```shell
pip3 install uWSGI-2.0.21.tar.gz
```
编写配置文件
```shell
[root@proxy python]# vim myproject.ini #要以ini结尾,文件名自定义
------------------------------------------------------------------------
[uwsgi]
socket=127.0.0.1:8000 #与web服务(nginx)通信的接口
chdir=/var/python/python-project-demo #网站的工作目录
wsgi-file=learning_log/wsgi.py #定义网站运行时,uwsgi调用的脚本文件
daemonize=/var/log/uwsgi.log #指定日志文件位置
```
运行uWSGI
```shell
uwsgi --ini myproject.ini #读取myproject.ini运行uWSGI
ss -antlp | grep 8000 #8000已经监听,成功启动
```
修改nginx配置文件,添加uWSGI转发
```shell
location / {
uwsgi_pass 127.0.0.1:8000; #动态页面交给uWSGI
include uwsgi_params; #加载调用uWSGI配置文件
root html;
index index.html index.htm;
}
```
测试,访问192.168.99.5
二、灰度发布
> 灰度发布使用平稳的过度方式升级或替换产品项目的方法统称
1.配置Nginx实现用IP测试灰度发布
版本布局:
当前版本(v1)——web1:80、web2:80
测试版本(v2)——web1:8001
为web1和web2搭建nginx虚拟主机,需要注意httpd是否在占用80端口
修改web1与web2的nginx配置文件并创建对应的网页
```shell
#web1的nginx配置文件
http {
...
server { #新添加的测试server
listen 8000;
server_name localhost;
root html8000;
index index.html;
}
server {
listen 80;
server_name localhost;
...
echo "test web1 nginx 8000" > html8000/index.html
echo "test web1 nginx 80" > html/index.html
-----------------------------------------------------------------------
#web2的nginx配置文件
http {
...
server {
listen 80;
server_name localhost;
...
echo "test web2 nginx 80" > html/index.html
```
修改proxy的nginx集群配置
```shell
http {
...
upstream default { #当前版本业务集群
server 192.168.99.100:80;
server 192.168.99.200:80;
}
upstream testserver {
server 192.168.99.100:8000; #测试版本业务集群
}
server {
listen 80;
server_name localhost;
#设置自定义变量$group,默认访问default集群
set $group "default";
if ($remote_addr ~ "192.168.99.1"){
#如果客户机ip包含192.168.99.1就访问测试版本业务集群
#remote_addr是nginx的内置变量,存放访问者的ip
set $group testserver; #重新赋值变量
}
location / {
proxy_pass http://$group; #调用集群
root html;
index index.html index.htm;
}
...
```
重载测试,使用不同的ip地址访问192.168.99.5
2.通过不同用户ID测试灰度发布
修改php页面内容
三、网站限流限速
编写nginx配置文件
```shell
#全局限速与局部限速
http {
...
limit_rate 100k; #全局限速,速度限制100k上下浮动
server {
listen 80;
server_name localhost;
limit_rate 200k; #虚拟主机局部限速,优先级高于全局限速
```
```shell
#定义用户访问不同内容时速度不一样
http {
...
server {
...
listen 80;
...
location /file_a { #用户file_a目录下的内容限速300k
limit_rate 300k;
}
location /file_b { #用户访问file_b目录下的内容不限速
limit_rate 0k;
}
...
#创建对应的测试目录,拷贝对应的测试文件
```
```shell
#修改用户访问连接限制,客户同时打开多个连接并行下载也无法突破限制
http {
...
#全局限速,速度限制100k,最大100k的速度传输数据
limit_rate 100k;
#limit_conn_zone连接限制,控制连接数,$binary_remote_addr是nginx的内置变量,获取客户的地址,ip存储到addr文件中,空间为10m
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
...
location /file_a {
#用户file_a目录下的内容限速300k
limit_rate 300k;
#file_a目录下的文件只能下载一个,开多个页面不能下载
limit_conn addr 1;
}
...
```
制作一个大文件做测试,填充0到html/bigfile.img文件,大小100M,填充一次
```shell
dd if=/dev/zero of=html/test.img bs=100M count=1
```
重载测试使用wget命令
```shell
wget 192.168.99.5/bigfile.img
```
四、Nginx实现跨域访问
> 网站脚本调用不同端口、域名、协议的数据时被浏览器阻拦。或者说浏览器根据同源策略,会拦截非本网站端口、域名、协议的数据,前端开发编写网页功能,通过配置Nginx跨域指令即可解决
>
> 比如:#没有实现跨域
>
> 99.5:80(访问)——>99.5:80(返回结果)
>
> 99.5:8800(访问)——>99.5:8080(返回结果)
>
> #实现跨域
>
> 99.5:80(访问)——>99.5:8080(返回结果)
编写nginx配置文件
```shell
server {
listen 8080;
#服务器响应数据中添加允许跨域访问,*代表任意访问源
#add_header 'Access-Control-Allow-Origin' '*';
#修改具体允许请求的地址,增加安全
add_header 'Access-Control-Allow-Origin' 'http://192.168.99.5';
root html;
index index.html;
}
server {
listen 80;
...
```
重载,测试访问目标ip默认80端口的html,结果返回8080端口的html文件
> 跨域访问测试html文件
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>API-test</title>
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://192.168.99.5:8080/api.html',true);
xhr.send();
function change(){
if(xhr.readyState==4 && xhr.status==200){
alert(xhr.responseText);
}
}
</script>
</head>
<body>
<input id="button" type="button" value="测试" οnclick="change();">
</body>
```
rpm-build安装、VPN功能、frp连接Linux和windows系统实现内网穿透
#6 号晚上安装java的JDK并部署tomcat服务,配置Maven仓库并定位了阿里云镜像地址
```shell
版本信息:
java-1.8.0-openjdk
apache-tomcat-8.0.30 #/usr/local/tomcat
apache-maven-3.6.3 #/usr/local/maven
配置文件目录: /usr/local/maven/conf/settings.xml
#第159行
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
#!!!注意 .m2的tar包解压后一定要放在root下,因为maven库默认在root下,如果移动
```
一、rpm-build安装
rpm-build功能:代替手动源码安装步骤(配置、编译、安装)
```shell
#例子使用nginx-1.22.1版本的源码软件,生成对应的RPM包软件
# 软件名称为nginx
# 软件版本为1.22.1
# RPM软件包可以查询描述信息
# RPM软件包可以安装及卸载
```
安装rpm-build软件包
```shell
yum -y install rpm-build
```
自动生成rpmbuild目录结构,位于/root/rpmbuild
#SOURCES存放源码包的位置
#RPMS存放制作好的rpm位置
#SPECS存放制作软件包配置文件的位置
将nginx源码软件复制到SOURCES目录
```shell
cp /root/lnmp_soft/nginx-1.22.1.tar.gz /root/rpmbuild/SOURCES/
```
创建并修改SPEC配置文件,文件名任意,以.spec结尾
```shell
vim /root/rpmbuild/SPECS/nginx.spec
```
nginx.spec配置文件内容:
```shell
Name:nginx #源码包软件名称
Version:1.22.1 #源码包软件的版本号
Release:1 #制作nginx的RPM包版本号
Summary:nginx is a web server #RPM软件的概述
#Group: #组,目前不需要,直接注释或者删除
License:GPL #License授权协议,GPL自由软件
URL:www.test.com #网址,自行定义
Source0:nginx-1.22.1.tar.gz #源码包文件的全称
#BuildRequires:
#制作RPM时安装的软件包gcc,make,pcre-devel,openssl-devel等,即构建依赖,不用写,直接注释,在这只是提示作用,还是需要自己安装
Requires:pcre-devel openssl-devel #rpm包制作好之后,安装RPM时的依赖关系
%description
nginx is a web server #软件的详细描述
%post #rpm包安装后执行的命令
useradd nginx
%prep
%setup -q #自动解压源码包,并cd进入目录
%build
./configure --user=nginx #配置
make %{?_smp_mflags}
%install
%make_install
%files
%doc
/usr/local/nginx/* #对哪些文件与目录打包
%changelog
```
rpmbuild创建RPM软件包
```shell
rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec
```
验证:
查看目录下是否存在nginx安装包
/root/rpmbuild/RPMS/x86_64/nginx-1.22.1-1.x86_64.rpm
停止nginx服务并删除nginx文件
使用yum -y install /root/rpmbuild/RPMS/x86_64/nginx-1.22.1-1.x86_64.rpm
二、VPN功能
通过wireguard-tools实现主机之间的VPN功能
检查当前主机内核:uname -r
服务端操作:
安装VPN软件:yum -y install /root/vpn/linux/*.rpm
在vpn/linux目录下制作密钥:wg genkey | tee private.key | wg pubkey > public.key
#生成私钥存入private.key,再利用私钥生成公钥存入public.key
生成服务端配置文件
```
vim /etc/wireguard/Linux_Server_VPN.conf
```
修改配置文件:
```shell
[Interface] #服务端配置
PrivateKey = mJ5rYtzBv2QBmwEBtx0RU0NYqxu3Vo+W7DzoPv8H4G4= #服务器的私钥
Address = 20.20.20.1/8 #VPN内部使用的IP和掩码
ListenPort = 25535 #WireGuard服务监听的端口,可以随便更改
[Peer] #对端(客户端)配置
PublicKey = ROo6TSEohVh9oCHiMSQ+bXQgqczU+4E1NzeqBqHnuiM= #客户端的公钥
AllowedIPs = 20.20.20.2/32 #允许哪些客户端访问VPN服务器
```
启动服务:wg-quick up Linux_Server_VPN #VPN配置文件名
客户端操作:
安装VPN软件:yum -y install /root/vpn/linux/*.rpm
在vpn/linux目录下制作密钥:wg genkey | tee private.key | wg pubkey > public.key
生成服务端配置文件
```shell
vim /etc/wireguard/Linux_Client_VPN.conf
```
修改配置文件:
```shell
[Interface]
PrivateKey = cAq23lRiQtH5iwsnttbFgVJEswcobidNZVy+9IVkPlI= #客户端生成的私钥
Address = 10.10.10.2/8 #VPN客户端的IP和掩码
DNS = 8.8.8.8 #VPN客户端的DNS
[Peer] #对端,需要连接的服务器
PublicKey = pV1Jl0Vy2+jaxiNQ49RnuCQ0tg+1vxT+AEqsKUwvKXI= #服务器生成的公钥
Endpoint = 192.168.88.5:25535 #VPN服务器的公网IP地址和端口
AllowedIPs = 10.0.0.0/8 #哪些流量经过vpn传递
```
启动服务:wg-quick up Linux_Client_VPN #VPN配置文件名
测试:服务端ping客户端
Windows操作系统:
把wireguard.msi软件共享给windows,ftp、nfs、scp、http等等方法共享注意权限
<img src="image-20240903181104981.png" style="zoom: 67%;" />
<img src="image-20240903185249442.png" style="zoom: 80%;" />
<img src="image-20240903185725762.png" style="zoom: 67%;" />
windows搭建http服务:
<img src="image-20240903182830749.png" style="zoom:50%;" />
<img src="image-20240903182909884.png" style="zoom:50%;" />
windows网站目录:"C:\inetpub\wwwroot"
三、frp连接Linux和windows系统实现内网穿透