互联网框架day03(nginx、maven继承)

1.nginx的安装解压(1.9.9)
http://nginx.org/download/

通过cmd运行。首先进入nigix所在的目录,如下图所示:

三个命令:(在 CMD 中执行)

首先要切换到nginx的目录中

启动:start nginx.exe

停止:nginx.exe -s stop

重新加载:nginx.exe -s reload

在这里插入图片描述
若nginx.exe启动一闪而过,则需要修改nginx.conf中的默认端口,说明默认的端口与系统中的服务端口有冲突。

使用 http://localhost:端口

那么怎么知道自己的nginx是否启动成功:打开你的管理器,如在进程中看到两个nginx说明启动成功。
在这里插入图片描述
1.1. Nginx的配置
在这里插入图片描述

目录结构:
在这里插入图片描述
可以添加一个项目在此文件夹中,里边包含静态文件,css,js,html,有nginx管理,实现动态分离
conf:启动加载的核心配置文件nginx.congf是手动编辑的,其它的副本,back都是nginx.conf的测试版文件

logs:error.log:输出启动停止运行的各种错误信息,定位问题的首要观察的文件
access.log:运行的访问日志,通过什么浏览器,http协议访问的nginx,nginx转发了哪些内容
1.3启动和停止
启动:start nginx.exe
观察任务管理器是否有两个进程
在这里插入图片描述
master:主进程,管理nginx其它工作进程的唯一
workers:工作进程,主要负责并发的处理
默认配置workers的数量是1
停止:nginx.exe -s stop
重启nginx需要输入停止指令,必须确认是否正确停止,看任务管理器nginx进程是否全部消失,如果不能正确停止,就运行start,会报错

在这里插入图片描述
在这里插入图片描述

通过浏览器 http://www.os.com/user/query/point?userId=1能够访问到一个后台服务器tomcat启动在8090端口的

#入门案例www.os.com
	server{
		#三个关键字  listen  多个server监听同一个端口
		#一旦nginx监听了80端口,其它软件不能占用了80
		listen 80;
		#server_name  请求域名  request Host的头中的域名
		#当前server虚拟服务器在满足80端口访问监听后判断域名是否满足条件,不同的servier不能同时监听一个端口一个域名
		server_name www.os.com;
		#location 定义处理请求的具体过程
		#将当前请求转发给127.0.0.1:8090 的tomcat容器
		#"/" location 匹配域名端口后的url地址字符串
		# / 的意思是任何字符串都能匹配上
		#http:www.os.com/user/query/points?userId=1
		location / {
			#定义转发和符在均衡的逻辑
			proxy_pass http://127.0.0.1:8090/;
		}
	}

确定:http://www.os.com/先要访问到nginx才有server的作用在这里插入图片描述
配置host文件:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.3 可以在service层编写一些标识的字符串(端口号在pom文件里修改)
在这里插入图片描述

3.负载均衡的配置
在这里插入图片描述
在这里插入图片描述

#配置一个后端服务器的内存list对象
	#对象的变量名称叫做虚拟域名
	upstream orderuserserver{
		#根据后端服务器的访问地址编辑元素的内容
		server 127.0.0.1:8090;
		server 127.0.0.1:8091;
		server 127.0.0.1:8092;
	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在集群中容易出现故障,对于长时间不能恢复的集群节点,可以采用down的方式处理(宕机)
nginx.conf配置

#入门案例www.os.com
	#配置一个后端服务器的内存list对象
	#对象的变量名称叫做虚拟域名
	upstream orderuserserver{
		#根据后端服务器的访问地址编辑元素的内容  以及权重编辑
		server 127.0.0.1:8090 weight=1;
		server 127.0.0.1:8091 weight=2;
		server 127.0.0.1:8092 down;
	}

	server{
		#三个关键字  listen  多个server监听同一个端口
		#一旦nginx监听了80端口,其它软件不能占用了80
		listen 80;
		#server_name  请求域名  request Host的头中的域名
		#当前server虚拟服务器在满足80端口访问监听后判断域名是否满足条件,不同的servier不能同时监听一个端口一个域名
		server_name www.os.com;
		#location 定义处理请求的具体过程
		#将当前请求转发给127.0.0.1:8090 的tomcat容器
		#"/" location 匹配域名端口后的url地址字符串
		# / 的意思是任何字符串都能匹配上
		#http:www.os.com/user/query/points?userId=1
		location / {
			#定义转发和符在均衡的逻辑
			#proxy_pass http://127.0.0.1:8090/;
			proxy_pass http://orderuserserver/;
		}
		
		#location /image{
		#	proxy_pass http://10.9.39.13:8091/
		#}
		#location =/haha{}
		#location ~.png${}
	}

3.3 IP黏着
session的集群共享问题(用户登录状态访问)
IP黏着的解决问题
session无法在集群中共享
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
http://www.image.com/1.jpg
在这里插入图片描述
在这里插入图片描述
root表示拼接的实际根目录文件夹
index表示默认的访问资源
在这里插入图片描述

#静态文件的处理
	server{
		listen 80;
		server_name www.image.com;
		#/1.jpg
		location /{
			#需要引入一个关键字指定静态文件的根目录
			#D://根目录
			root D://;
			#表示默认的访问资源www.image.com访问时
			#D://k.html
			index k.html;
		}
	}

2.动静分离处理订单用户demo中所有的静态文件
2.1动静分离的实际应用
由于nginx可以处理静态文件,后端服务器可以不再做静态资源的维护工作,相同的静态文件,提取到nginx来处理
easymall就有 在nginx的根目录下的easymall的文件夹有静态文件

修改nginx配置
在这里插入图片描述
在这里插入图片描述
配置文件:

server {
		listen 80;
		server_name www.ssm.com;
		location /user{
			proxy_pass http://orderuserserver/user;
			add_header 'Access-Control-Allow-Origin' '*';
			add_header 'Access-Control-Allow-Credentials' 'true';
		}
		location /order{
			proxy_pass http://orderuserserver/order;
			add_header 'Access-Control-Allow-Origin' '*';
			add_header 'Access-Control-Allow-Credentials' 'true';
		}
		location /{
			#相对路径easymall 相当于c:\\
			root easymall;
			index index.html;
		}


	}

在这里插入图片描述
在这里插入图片描述
nginx.conf的完整配置

#入门案例www.os.com
	#配置一个后端服务器的内存list对象
	#对象的变量名称叫做虚拟域名
	upstream orderuserserver{
		#根据后端服务器的访问地址编辑元素的内容  以及权重编辑
		#ip_hash;
		server 127.0.0.1:8090 weight=1;
		server 127.0.0.1:8091 weight=2;
		server 127.0.0.1:8092 down;
	}

	server {
		listen 80;
		server_name www.ssm.com;
		location /user{
			proxy_pass http://orderuserserver/user;
			add_header 'Access-Control-Allow-Origin' '*';
			add_header 'Access-Control-Allow-Credentials' 'true';
		}
		location /order{
			proxy_pass http://orderuserserver/order;
			add_header 'Access-Control-Allow-Origin' '*';
			add_header 'Access-Control-Allow-Credentials' 'true';
		}
		location /{
			#相对路径easymall 相当于c:\\
			root easymall;
			index index.html;
		}


	}









	
	server{
		#三个关键字  listen  多个server监听同一个端口
		#一旦nginx监听了80端口,其它软件不能占用了80
		listen 80;
		#server_name  请求域名  request Host的头中的域名
		#当前server虚拟服务器在满足80端口访问监听后判断域名是否满足条件,不同的servier不能同时监听一个端口一个域名
		server_name www.os.com;
		#location 定义处理请求的具体过程
		#将当前请求转发给127.0.0.1:8090 的tomcat容器
		#"/" location 匹配域名端口后的url地址字符串
		# / 的意思是任何字符串都能匹配上
		#http:www.os.com/user/query/points?userId=1
		location / {
			#定义转发和符在均衡的逻辑
			#proxy_pass http://127.0.0.1:8090/;
			proxy_pass http://orderuserserver/;
		}
		
		#location /image{
		#	proxy_pass http://10.9.39.13:8091/
		#}
		#location =/haha{}
		#location ~.png${}
	}

	#静态文件的处理
	server{
		listen 80;
		server_name www.image.com;
		#/1.jpg
		location /{
			#需要引入一个关键字指定静态文件的根目录
			#D://根目录
			root D://;
			#表示默认的访问资源www.image.com访问时
			#D://k.html
			index k.html;
		}
	}

项目的拆分
2.1横向拆分
在这里插入图片描述
在这里插入图片描述
案例:
demo2项目中有一个domain包,将这个包拆分到另一个maven工程的项目中,打成war包,然后引入demo2工程的pom文件中,达到的功能不变,实现了项目的横向拆分(打成war包之后,此工程可以删除,保证war包存在即可)
在这里插入图片描述

在这里插入图片描述
纵向拆分解决了两个问题
系统间的通信问题(代码解决)
在这里插入图片描述
做纵向拆分的结果是实现了一个小的微服务集群
ssm框架会导致纵向拆分的功能的系统越来越多,重复的配置就越多,独立的配置环境(需要框架解决-------springboot)
一个简单的案例:
pom文件配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cn.tedu</groupId>
  <artifactId>springboot-mydemo1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>springboot-mydemo1</name>
  <url>http://maven.apache.org</url>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
	</parent>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-web</artifactId>
  		
  	</dependency>
  
  
    <!-- <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency> -->
  </dependencies>
</project>

两层架构

package cn.tedu.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.tedu.service.HelloService;

@RestController
public class HelloController {
	@Autowired
	private HelloService helloService;
	//���Է��������Ʋ��ҵ���
	@RequestMapping("hello")
	public String sayHello(String name){
		return "CONTROLLER:"+helloService.sayHello(name);
	}
}

package cn.tedu.service;

import org.springframework.stereotype.Service;


@Service
public class HelloService {
	//ҵ�����־ò�
	public String sayHello(String name) {
		
		return "service hi"+ name;
	}

}

启动项:

package cn.tedu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class StarterWeb {
	public static void main(String[] args) {
		SpringApplication.run(StarterWeb.class, args);
	}
}

控制台效果:

. ____ _ __ _ _
/\ / __ _ () __ __ _ \ \ \
( ( )_
_ | '_ | '| | ’ / ` | \ \ \
\/ )| |)| | | | | || (| | ) ) ) )
’ |
| .__|| ||| |__, | / / / /
=|_|======|/=////
:: Spring Boot :: (v1.5.9.RELEASE)

页面效果:
在这里插入图片描述

maven的继承
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

内容概要:本文详细介绍了CCF-GESP认证的学习资源与知识点指南,分为官方资源与平台、知识点学习与解析、备考策略与工具、实战项目与进阶资源以及学习工具推荐五个部分。官方资源包括CCF数字图书馆提供的免费真题库、一站式学习平台和GESP官网的最新真题下载及考试环境说明。知识点学习部分涵盖Python、C++和图形化编程(Scratch)的核心内容与实战案例。备考策略方面,提出了基础、强化和冲刺三个阶段的分阶段计划,并强调了在线题库模拟测试与社区交流的重要性。实战项目与进阶资源则为不同编程语言提供了具体的应用场景,如Python的智能客服机器人和C++的并行编程与嵌入式开发。最后,推荐了多种学习工具,如代码编辑器VS Code、模拟考试平台和社区支持渠道。 适合人群:准备参加CCF-GESP认证考试的考生,特别是对Python、C++或Scratch编程语言有兴趣的学习者。 使用场景及目标:①帮助考生系统化地学习官方资源,熟悉考试形式和内容;②通过分阶段的备考策略,提高应试能力和编程技能;③利用实战项目和进阶资源,增强实际编程经验和解决复杂问题的能力。 阅读建议:建议考生按照文章中的分阶段备考策略逐步推进学习进度,充分利用官方提供的资源进行练习和模拟测试,并积极参与社区交流以获取更多备考经验和疑难解答。
<think>好的,我现在需要解决用户的问题,他遇到了两个错误:一个是SyntaxWarning,关于无效的转义字符'\m',另一个是找不到msedge.exe的路径。用户之前询问过如何通过Python启动Microsoft Edge并添加调试参数,现在在尝试过程中出现了问题。 首先,分析第一个错误:SyntaxWarning: invalid escape sequence '\m'。用户提供的代码中有edge_path = ".\msedge.exe.lnk"。这里的字符串使用了反斜杠,而Python中反斜杠是转义字符。在字符串中,像"\m"这样的组合会被Python解释为转义序列,但因为没有对应的转义字符,所以会触发警告。解决方法应该是使用原始字符串(在字符串前加r)或者将反斜杠改为双反斜杠,或者使用正斜杠。这需要建议用户修改路径的写法。 第二个错误是“����: û���ҵ����� "msedge.exe"”,看起来可能是编码问题导致的乱码,原意应该是路径错误,找不到msedge.exe。用户可能使用了相对路径".\msedge.exe.lnk",但实际文件可能不存在于当前工作目录,或者链接文件有问题。需要检查路径是否正确,建议用户使用绝对路径,并确认msedge.exe的实际安装位置。例如,在Windows默认安装路径是"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe",或者用户可能安装了Edge Chromium版本,路径可能不同。同时,用户使用了.lnk快捷方式文件,但subprocess可能无法正确解析快捷方式,应该直接指向exe文件。 接下来,要组织回答的结构,先解释错误原因,再给出解决方案。可能需要分步骤说明如何解决这两个问题,包括修正转义字符和正确指定Edge路径。另外,用户之前的代码示例中已经给出过绝对路径的示例,但用户可能尝试了相对路径或快捷方式,所以需要提醒用户使用正确的绝对路径,并避免使用快捷方式文件。此外,可能需要指导用户如何确认Edge的实际安装路径,例如通过右键快捷方式查看属性中的目标路径。 还需要考虑用户可能的操作系统环境,之前的回答提到了Windows、macOS和Linux的路径,但用户当前的错误提示中的路径是Windows风格的(反斜杠和.lnk文件),所以主要针对Windows系统进行解答。最后,确保提供的代码示例正确,并提醒用户注意路径中的转义问题,以及验证路径是否存在。</think>--- ### **问题原因分析** 你遇到的错误包含两个关键问题: 1. `SyntaxWarning: invalid escape sequence '\m'`:路径字符串中的反斜杠 `\` 触发了Python转义字符解析错误。 2. `����: û���ҵ����� "msedge.exe"`:路径指向无效的快捷方式(`.lnk`),无法直接通过`subprocess`调用。 --- ### **解决方案分步说明** #### **1. 修复转义字符问题** 在Python字符串中,反斜杠 `\` 是转义符号,需通过以下任一方式修正: - **方法1:使用原始字符串(推荐)** ```python edge_path = r".\msedge.exe.lnk" # 添加 r 前缀 ``` - **方法2:改用正斜杠** ```python edge_path = "./msedge.exe.lnk" # 跨平台兼容 ``` #### **2. 解决路径无效问题** `.lnk` 是Windows快捷方式文件,不能直接作为可执行文件调用。需分两步处理: 1. **找到Edge真实安装路径**: - 右键桌面Edge快捷方式 → 属性 → 复制**“目标”**中的路径(通常为): ```python edge_path = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" ``` - 或通过命令定位(CMD中执行): ```bash where msedge.exe ``` 2. **使用绝对路径启动**: ```python import subprocess edge_path = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" subprocess.Popen([edge_path, "--remote-debugging-port=9222"]) ``` --- ### **完整修正代码** ```python import subprocess # 修正后的路径(使用原始字符串 + 绝对路径) edge_path = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" try: subprocess.Popen([edge_path, "--remote-debugging-port=9222"]) except FileNotFoundError: print("错误:请按以下步骤检查路径:") print("1. 右键桌面Edge图标 → 属性 → 复制目标路径") print("2. 确保路径中存在msedge.exe文件") ``` --- ### **关键验证步骤** 1. **检查文件是否存在**: ```python import os print(os.path.exists(edge_path)) # 应输出True ``` 2. **手动测试命令行**(CMD中执行): ```bash "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222 ``` --- ### **替代方案:使用快捷方式解析** 若必须使用`.lnk`快捷方式,需借助第三方库解析目标路径: ```python # 安装依赖库 pip install pywin32 import win32com.client def get_shortcut_target(lnk_path): shell = win32com.client.Dispatch("WScript.Shell") shortcut = shell.CreateShortCut(lnk_path) return shortcut.TargetPath edge_lnk = r".\msedge.exe.lnk" edge_path = get_shortcut_target(edge_lnk) # 解析真实路径 subprocess.Popen([edge_path, "--remote-debugging-port=9222"]) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值