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的继承