一、系统文件结构

Linux系统不同于Windows系统,在Linux系统中没有盘符,根路径用“/”表示

  1. [root@iZ0jlddp8rf9uclhzchc2kZ ~]# cd /
  2. [root@iZ0jlddp8rf9uclhzchc2kZ /]# ls
  3. bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
  4. [root@iZ0jlddp8rf9uclhzchc2kZ /]#
目录 说明
bin 系统文件夹
sbin 超级管理员的系统命令
boot 系统所需目录(系统启动相关文件)
etc 存放系统配置相关文件(环境变量)
lib/lib64 library存放系统所需的依赖库
home 一般用户所在文件夹(此目录包含了所有普通用户的子目录)
root 超级管理员目录(root用户目录)
media 媒体(光驱)
mnt 挂载(U盘、移动硬盘)
tmp、opt 临时的文件存储目录,比如日志存储在tmp或opt中
usr 用户目录,我们通常安装的软件、用户的一些文件都在此目录下
run、srv、sys、var、proc、dev 系统相关目录

二、系统指令语法

指令 选项 参数

  • 指令:决定了当前的操作
  • 选项:可有可无(对于有些指令,选项是必须的)
    • “-”表示短选项,一个字母代表一个选项
    • “—”表示长选项,一个单词代表一个选项
  • 参数:指令正常执行所需的数据

man指令(manual:说明书)

  • man 指令
  • 输入q退出说明书

三、常用指令

3.1、目录操作

  • 进入文件夹及退出文件夹
    • cd 目录名称 进入指定的目录(当我们输入目录的名称的时候,可以通过Tab自动补全)
      ```shell

      进入到Linux系统的根路径

      cd /

进入到当前用户的目录(如果是root用户则进入到/root,如果是其他用户则进入到/home/中的用户目录)

cd ~

  1. - `cd ..` 退出当前目录
  2. - `pwd` print working directory)查看当前路径
  3. - 绝对路径与相对路径
  4. ```shell
  5. ##绝对路径,cd指令参数的路径如果是以 / 开头,表示从系统的根路径下去查找
  6. cd /path
  7. ##相对路径,cd指令参数的路径如果没有 / 开头,则表示从当前目录去查找
  8. cd path
  • 显示当前目录下的文件列表
    • ls 显示文件列表
    • ls -a 显示当前目录下所有文件列表(包括隐藏文件)
    • ls -l 显示当前目录下文件列表的详细信息
    • ll 显示文件列表详细信息
  • 目录的创建和删除
    • mkdir 目录名 在当前目录下创建新的目录(创建一级目录)
    • mkdir -p 目录A/目录B 连同父级目录一起创建
    • rm 目录 删除当前目录
    • rmdir 目录 专门用来删除目录
    • rm -rf 目录 强制递归删除目录
      • -r recursive 递归
      • -f force 强制

3.2、文件操作

  • 创建和修改文件
    • vi (visual)文件编辑
    • vim (visual improved)增强文件编辑
      ```shell

      打开目标文件,如果此文件不存在,则表示先创建此文件再打开

      vi a.txt

使用“+”直接跳转行数

vim +12 a.txt

  1. - 当文件打开之后,输入“i”/“a”进入到编辑状态
  2. - 当完成编辑后,输入“esc”退出编辑状态
  3. - 退出文件:
  4. - :q 如果未对文件进行任何修改——退出文件
  5. - :q! 对文件内容进行了修改,但是不保存退出
  6. - :wq 保存对文件的修改并退出
  7. - 阅读文件
  8. - `cat 文件名` 阅读文件内容,适合阅读小文件
  9. - `cat -n 文件名` 阅读文件时可以显示行号
  10. - `more 文件名` 阅读文件,带有翻页(回车一次往下一行,不支持向上翻页)
  11. - `less 文件名` 阅读文件,适合阅读大文件;可以上下翻页(PgUp/PgDn),退出less阅读模式输入“q
  12. - less阅读模式下,输入“?查询内容”可以向上查询数据;输入“/查询内容”可以向下查询内容
  13. - 查询文件和查询内容
  14. - `find 文件名` 在当前目录查找文件/目录
  15. - `find 文件名 目录` 在指定的目录中查找文件
  16. - `find -name 文件名` 在当前目录包括当前目录的子目录中查找文件
  17. - `grep -n 内容 文件` 在指定的文件中查找指定的内容
  18. - 管道命令
  19. - 管道命令:多个命令的组合
  20. - 特征:前面的命令必须有输出,后面的命令必须使用这个输出
  21. - 实例:`cat a.txt | grep hello | grep 23`
  22. - 删除文件
  23. - `rm -rf 文件名`
  24. - 复制和移动
  25. - `cp 文件 目录`
  26. - `mv 文件 目录`
  27. <a name="2fd4cc5c"></a>
  28. ### 3.3、文件压缩和解压
  29. - windows系统下压缩文件通常是ziprar等格式;Linux系统压缩文件通常是tar.gz
  30. - tar指令 完成Linux系统的压缩与解压操作
  31. - `tar -zcvf` 压缩
  32. ```shell
  33. #对test1目录进行压缩,压缩到test1.tar文件
  34. tar -zcvf test1.tar test1
  35. #将test1和test2进行压缩,压缩到test.tar文件
  36. tar -zcvf test.tar test1 test2
  • tar -zxvf 解压
    1. #解压指定的压缩文件
    2. tar -zxvf test.tar
  • 选项说明:
    • z 用gzip工具进行压缩或者解压
    • x extract解压缩
    • c compress压缩
    • v verbose显示压缩/解压过程中详细信息
    • f file文件

3.4、用户及权限管理

Linux系统支持多用户,并且采用用户组的形式管理多个用户(root用户就在root用户组)

Linux中的用户管理,采用的用户组形式

用户组 用户

root root

在Linux提供了比较严格的权限管理(用户对文件/目录的操作权限,root用户默认具有所有文件的操作权限)

权限:读、写、可执行

  • 用户组
    • groupadd team1 创建用户组
    • groupdel team1 删除用户组
  • 用户
    • useradd -g 用户组 用户名 创建新用户
    • passwd 用户名 设置用户密码
    • userdel 用户名 删除用户
  • 切换用户
    • su 用户名 切换至其他普通用户
    • su 切换至管理员(需要输入超级管理员密码)
  • 权限管理
    • drwxr-xr-x 说明:
      • 第一个字符表示文件/目录,“d”表示目录,“-”表示文件
      • r可读(4)、w可写(2)、x可执行(1)
      • 第一个rwx:表示当前文件的所有者拥有的权限
      • 第二个rwx:表示和文件所有者同组用户拥有的权限
      • 第三个rwx:表示不同组用户拥有的权限
    • chmod 修改权限
      • chmod 775 文件名

3.5、系统与进程

  • 查询进程
    • top
    • lsof -i:port 通过端口查询进程信息
      • 如果此指令不可以使用,则需要通过yum install -y lsof安装指令
      • CentOS6 Ubuntu没有此指令
    • netstat -apn | grep port 通过端口查询进程信息(CentOS6)
  • ps -ef | grep java 通过进程名查找进程
  • 强杀进程
    • kill -9 PID 通过进程编号强杀进程
  • 系统注销和重启
    • logout 注销
    • reboot 重启

四、软件管理相关的指令(wget、rpm、yum)

4.1、wget指令

我们在linux中安装软件,首先要完成软件安装包的下载;获取linux系统中软件的安装包,我么有两种途径:

  • 在windows中进行下载(百度搜索下载),然后将安装包上传到linux系统中
  • 直接在linux系统中,通过wget下载

4.1.1、wget介绍

  • wget是linux系统中一个下载文件的工具,linux系统自带

4.1.2、wget使用

  • wget [option] url
  • mysql下载:wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

4.2、rpm指令

4.2.1、rpm介绍

RPM(Rad-Hat Package Manager)是一款linux系统的软件包的管理器,可以完成linux系统中应用的安装、卸载

4.2.2、rpm指令

  • 查询:rpm -qa | grep 关键字
  • 卸载:rpm -e --nodeps 软件名称
  • 安装:rpm -ivh 安装包.rpm
    • mysql安装:rpm -ivh mysql57-community-release-el7-10.noarch.rpm
  • 更新:rpm -Uvh 安装包.rpm

4.3、yum指令

4.3.1、yum介绍

yum(全称:Yellow Dog Updater,Modified),基于RPM包管理,能够从指定的夫区其自动下载rpm并安装,可以自动处理依赖关系,一次安装所有的依赖软件,无需一个个的下载安装

4.3.2、yum指令

  • yum [-y] install http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
  • yum list 列出系统中所有的包
  • yum [-y] install rpm包 下载并安装rpm包
  • yum update rpm包
  • yum remove rpm包

五、JDK安装(离线安装)

5.1、下载JDK(Linux版)

网盘/云盘(jdk.tar.gz)

5.2、将下载的安装包上传到/usr/local目录

11、Linux - 图1

5.3、解压JDK安装包

  1. tar -zxvf jdk-8u281-linux-x64.tar.gz

得到一个jdk1.8.0_281的文件夹

5.4、查看JDK工具

11、Linux - 图2

5.5、配置环境变量

  • 进入到/etc目录,找到profile文件
  • 编辑profile文件:vim profile
    • 在profile文件最后配置以下内容
      1. export JAVA_HOME=/usr/local/jdk1.8.0_281
      2. export JRE_HOME=$JAVA_HOME/jre
      3. export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
      4. export PATH=$JAVA_HOME/bin:$PATH

5.6、让配置生效

source /etc/profile

  1. #让配置生效
  2. [root@iZ0jlddp8rf9uclhzchc2kZ etc]# source /etc/profile
  3. #显示jdk版本
  4. [root@iZ0jlddp8rf9uclhzchc2kZ etc]# java -version
  5. java version "1.8.0_281"
  6. Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
  7. Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)

六、Tomcat安装

6.1、下载离线tar

apache-tomcat-8.5.73.tar

6.2、上传到linux

11、Linux - 图3

6.3、解压tar文件v

  1. tar -zxvf apache-tomcat-8.5.73.tar.gz

6.4、启动tomcat

进入bin文件夹下,并使用./startup.sh启动tomcat

11、Linux - 图4

开启后,访问地址8.130.18.255即可看到

如果想关闭tomcat,先用losf -i:8080 查看进程号,再使用kill -9 进程号关闭

七、MySQL安装(在线安装)

7.1、安装过程

7.1.1、通过wget指令下载mysql的rpm文件

  1. [root@iZ0jlddp8rf9uclhzchc2kZ local]# pwd
  2. /usr/local
  3. [root@iZ0jlddp8rf9uclhzchc2kZ local]# ls
  4. aegis apache-tomcat-8.5.73.tar.gz etc include jdk-8u281-linux-x64.tar.gz lib64 sbin src
  5. apache-tomcat-8.5.73 bin games jdk1.8.0_281 lib libexec share
  6. [root@iZ0jlddp8rf9uclhzchc2kZ local]# wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

11、Linux - 图5

7.1.2、rpm安装mysql

  1. [root@iZ0jlddp8rf9uclhzchc2kZ local]# rpm -ivh mysql57-community-release-el7-10.noarch.rpm

7.1.3、通过yum安装mysql服务

  1. [root@iZ0jlddp8rf9uclhzchc2kZ local]# yum -y install mysql-community-server

7.1.4、加入开机启动

  1. [root@iZ0jlddp8rf9uclhzchc2kZ local]# systemctl enable mysqld

7.1.5、启动MySQL服务

  1. [root@iZ0jlddp8rf9uclhzchc2kZ local]# systemctl start mysqld
  2. [root@iZ0jlddp8rf9uclhzchc2kZ local]# lsof -i:3306
  3. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  4. mysqld 13083 mysql 21u IPv6 82453 0t0 TCP *:mysql (LISTEN)

7.1.6、停止与重启MySQL服务

  1. [root@iZ0jlddp8rf9uclhzchc2kZ local]# systemctl stop mysqld
  2. [root@iZ0jlddp8rf9uclhzchc2kZ local]# systemctl restart mysqld

7.2、MySQL基本使用

MySQL安装完成后,会有一个默认账号,但是没有设置自定义密码(在安装的时候生成了默认初始密码,使用默认密码只能进行登录操作,登录进去后必须要修改初始密码才能正常使用数据库)

7.2.1、查找初始密码

  1. cat /var/log/mysqld.log | grep password

7.2.1、登录到mysqld

  1. [root@iZ0jlddp8rf9uclhzchc2kZ local]# mysql -uroot -p

7.2.3、修改密码

设置密码的检查机制为LOW

  1. mysql> set global validate_password_policy=LOW;
  2. Query OK, 0 rows affected (0.00 sec)

修改密码

  1. mysql> set password=password('mysql6610');
  2. Query OK, 0 rows affected, 1 warning (0.00 sec)

7.2.4、授权远程登录

  1. GRANT ALL PRIVILEGES on *.* to 'root'@'%' IDENTIFIED by 'mysql6610' WITH GRANT OPTION;
  2. flush PRIVILEGES;

八、部署运行

后端部署

  1. [root@iZ0jlddp8rf9uclhzchc2kZ ygmall]# java -jar api-2.0.1.jar
  2. #使用 ctrl+c 退出

11、Linux - 图6

  1. [root@iZ0jlddp8rf9uclhzchc2kZ ygmall]# java -jar api-2.0.1.jar &
  2. #使用 ctrl+c
  1. [root@iZ0jlddp8rf9uclhzchc2kZ ygmall]# nohup java -jar api-2.0.1.jar &
  2. #nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行

前端部署

前端项目也需要部署在服务器上才能实现多用户访问

1、云主机安装服务器

tomcat可以作为前端项目部署的服务器使用

2、进入tomcat修改端口

  1. [root@iZ0jlddp8rf9uclhzchc2kZ ygmall]# cd /usr/local/apache-tomcat-8.5.73
  2. [root@iZ0jlddp8rf9uclhzchc2kZ apache-tomcat-8.5.73]# ls
  3. bin conf lib logs README.md RUNNING.txt webapps
  4. BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
  5. [root@iZ0jlddp8rf9uclhzchc2kZ apache-tomcat-8.5.73]# cd conf/
  6. [root@iZ0jlddp8rf9uclhzchc2kZ conf]# ls
  7. Catalina catalina.properties jaspic-providers.xml logging.properties tomcat-users.xml web.xml
  8. catalina.policy context.xml jaspic-providers.xsd server.xml tomcat-users.xsd
  9. #使用cat -n 查看所在的行数
  10. [root@iZ0jlddp8rf9uclhzchc2kZ conf]# cat -n server.xml | grep 8080
  11. 67 Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
  12. 69 <Connector port="8080" protocol="HTTP/1.1"
  13. 75 port="8080" protocol="HTTP/1.1"
  14. #使用vim + 打开指定行数
  15. [root@iZ0jlddp8rf9uclhzchc2kZ conf]# vim +69 server.xml

11、Linux - 图7

将文件内部的端口8080修改为9999,并启动tomcat

  1. [root@iZ0jlddp8rf9uclhzchc2kZ conf]# cd ../bin
  2. [root@iZ0jlddp8rf9uclhzchc2kZ bin]# ls
  3. bootstrap.jar ciphers.sh daemon.sh shutdown.bat tomcat-native.tar.gz
  4. catalina.bat commons-daemon.jar digest.bat shutdown.sh tool-wrapper.bat
  5. catalina.sh commons-daemon-native.tar.gz digest.sh startup.bat tool-wrapper.sh
  6. catalina-tasks.xml configtest.bat setclasspath.bat startup.sh version.bat
  7. ciphers.bat configtest.sh setclasspath.sh tomcat-juli.jar version.sh
  8. [root@iZ0jlddp8rf9uclhzchc2kZ bin]# ./startup.sh
  9. Using CATALINA_BASE: /usr/local/apache-tomcat-8.5.73
  10. Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.73
  11. Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.5.73/temp
  12. Using JRE_HOME: /usr/local/jdk1.8.0_281/jre
  13. Using CLASSPATH: /usr/local/apache-tomcat-8.5.73/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.73/bin/tomcat-juli.jar
  14. Using CATALINA_OPTS:
  15. Tomcat started.
  16. [root@iZ0jlddp8rf9uclhzchc2kZ bin]# lsof -i:8080
  17. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  18. java 21012 root 14u IPv6 227784 0t0 TCP *:webcache (LISTEN)
  19. [root@iZ0jlddp8rf9uclhzchc2kZ bin]# lsof -i:9999
  20. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  21. java 21069 root 56u IPv6 228612 0t0 TCP *:distinct (LISTEN)
  22. [root@iZ0jlddp8rf9uclhzchc2kZ bin]#

3、将前端项目放置到webapps文件下重启运行

11、Linux - 图8

4、修改云服务器端口,放行9999端口

然后使用http://8.130.18.255:9999/ygmall-static(forLinux)/index.html地址访问

注意需加项目名称

11、Linux - 图9

5、使用tomcat部署前端项目存在的问题

1、前端项目的一个页面会包含大量的css/js/图片,会有大量的并发请求,tomcat难以满足并发的需求

2、tomcat的核心价值在于能够编译执行java代码,而不是处理并发,同时前端项目中没有java程序,从功能上讲前端项目的部署也用不到tomcat

九、Nginx

1、Nginx介绍

1.1、为什么使用Nginx

  • 静态资源访问

前端项目在进行服务器部署的时候,如果基于Tomcat不能满足并发的需求,因此我们需要一种能够处理更高并发的适用于静态资源的服务器


  • 将tomcat配置到nginx中,在nginx.conf中添加配置
    再在server中添加内容:

    代理服务器实现负载均衡

    1. #声明服务器组
    2. upstream myservers{
    3. server localhost:8082;
    4. server localhost:8083;
    5. }
    1. location / {
    2. proxy_pass http://myservers;
    3. }

1.2、Nginx介绍

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务

  • Nginx是基于HTTP协议的请求/响应(部署web项目)——静态资源服务器
  • Nginx可以作为反向代理服务器 ——负载均衡服务器(代理服务器)

Nginx特定:

  • 稳定性极强,可以实现7*24不间断运行
  • 提供简洁、直观的配置
  • 占用内存很小、并发能力很强(5W+)

2、Nginx下载安装及配置

2.1、Windows环境

2.1.1、下载

下载地址:nginx: download

11、Linux - 图10

2.1.2、解压到指定目录

解压即可

11、Linux - 图11

2.1.3、运行及访问
  • 执行根路径下的nginx.exe,在任务管理器中可以看到已经在运行

11、Linux - 图12

  • nginx的默认端口是80
    在本机的浏览器地址栏输入localhost,80端口号可以省略
    11、Linux - 图13

2.2、Linux环境

2.2.1、安装编译工具(nginx安装之前需要编译)
  1. [root@iZ0jlddp8rf9uclhzchc2kZ local]# yum install -y gcc gcc-c++

2.2.2、安装PCRE
  1. #1、下载
  2. [root@iZ0jlddp8rf9uclhzchc2kZ local]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
  3. #2、安装
  4. [root@iZ0jlddp8rf9uclhzchc2kZ local]# tar -zxvf pcre-8.35.tar.gz
  5. #3、进入pcre目录
  6. [root@iZ0jlddp8rf9uclhzchc2kZ local]# cd pcre-8.35
  7. #4、配置
  8. [root@iZ0jlddp8rf9uclhzchc2kZ pcre-8.35]# ./configure
  9. #5、编译安装
  10. [root@iZ0jlddp8rf9uclhzchc2kZ pcre-8.35]# make && make install

2.2.3、安装SSL库
  1. [root@iZ0jlddp8rf9uclhzchc2kZ pcre-8.35]# cd /usr/local/
  2. [root@iZ0jlddp8rf9uclhzchc2kZ local]# wget --no-check-certificate http://www.openssl.org/source/openssl-1.0.1j.tar.gz
  3. [root@iZ0jlddp8rf9uclhzchc2kZ local]# tar -zxvf openssl-1.0.1j.tar.gz
  4. [root@iZ0jlddp8rf9uclhzchc2kZ local]# cd openssl-1.0.1j
  5. [root@iZ0jlddp8rf9uclhzchc2kZ openssl-1.0.1j]# ./config
  6. [root@iZ0jlddp8rf9uclhzchc2kZ openssl-1.0.1j]# make && make install

2.2.4、安装zlib库
  1. [root@iZ0jlddp8rf9uclhzchc2kZ openssl-1.0.1j]# cd /usr/local/
  2. [root@iZ0jlddp8rf9uclhzchc2kZ local]# wget http://zlib.net/zlib-1.2.11.tar.gz
  3. [root@iZ0jlddp8rf9uclhzchc2kZ local]# tar -zxvf zlib-1.2.11.tar.gz
  4. [root@iZ0jlddp8rf9uclhzchc2kZ local]# cd zlib-1.2.11
  5. [root@iZ0jlddp8rf9uclhzchc2kZ zlib-1.2.11]# ./configure
  6. [root@iZ0jlddp8rf9uclhzchc2kZ zlib-1.2.11]# make && make install

2.2.5、安装Nginx
  1. [root@iZ0jlddp8rf9uclhzchc2kZ zlib-1.2.11]# cd /usr/local
  2. [root@iZ0jlddp8rf9uclhzchc2kZ local]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
  3. [root@iZ0jlddp8rf9uclhzchc2kZ local]# tar -zxvf nginx-1.16.1.tar.gz
  4. [root@iZ0jlddp8rf9uclhzchc2kZ local]# mkdir -p server/nginx
  5. [root@iZ0jlddp8rf9uclhzchc2kZ local]# cd nginx-1.16.1
  6. [root@iZ0jlddp8rf9uclhzchc2kZ nginx-1.16.1]# ./configure --prefix=/usr/local/server/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/pcre-8.35
  7. [root@iZ0jlddp8rf9uclhzchc2kZ nginx-1.16.1]# make && make install
  1. #如果在配置过程中出现了以下错误:
  2. ./configure: error: SSL modules require the OpenSSL library.
  3. You can either do not enable the modules, or install the OpenSSL library
  4. into the system, or build the OpenSSL library statically from the source
  5. with nginx by using --with-openssl=<path> option.
  6. #执行:
  7. yum -y install openssl openssl-devel

安装完毕后,云主机开放80端口,即可进入

再进入conf文件夹进行配置

  1. [root@iZ0jlddp8rf9uclhzchc2kZ sbin]# cd /usr/local/server/nginx/
  2. [root@iZ0jlddp8rf9uclhzchc2kZ nginx]# ls
  3. client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp ygmall-static(forLinux)
  4. [root@iZ0jlddp8rf9uclhzchc2kZ nginx]# cd conf/
  5. [root@iZ0jlddp8rf9uclhzchc2kZ conf]# ls
  6. fastcgi.conf fastcgi_params.default mime.types nginx.conf.default uwsgi_params
  7. fastcgi.conf.default koi-utf mime.types.default scgi_params uwsgi_params.default
  8. fastcgi_params koi-win nginx.conf scgi_params.default win-utf
  9. [root@iZ0jlddp8rf9uclhzchc2kZ conf]# cat -n nginx.conf | grep location
  10. 43 location / {
  11. 53 location = /50x.html {
  12. 59 #location ~ \.php$ {
  13. 65 #location ~ \.php$ {
  14. 76 #location ~ /\.ht {
  15. 89 # location / {
  16. 111 # location / {
  17. [root@iZ0jlddp8rf9uclhzchc2kZ conf]# vim +43 nginx.conf

3、Nginx配置

配置文件说明:

  1. #user nobody;
  2. #配置处理器个数(应不大于cpu核心数)
  3. worker_processes 1;
  4. #error_log logs/error.log;
  5. #error_log logs/error.log notice;
  6. #配置nginx运行日志文件
  7. error_log logs/error.log info;
  8. #配置nginx进程号的存储文件
  9. pid logs/nginx.pid;
  10. #配置nginx能够支持的连接个数,数值越大,并发能力越强
  11. events {
  12. worker_connections 1024;
  13. }
  14. http {
  15. include mime.types;
  16. default_type application/octet-stream;
  17. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  18. # '$status $body_bytes_sent "$http_referer" '
  19. # '"$http_user_agent" "$http_x_forwarded_for"';
  20. #access_log logs/access.log main;
  21. sendfile on;
  22. #tcp_nopush on;
  23. #keepalive_timeout 0;
  24. #设置超时时间
  25. keepalive_timeout 65;
  26. #gzip on;
  27. server {
  28. #配置nginx端口号
  29. listen 80;
  30. #配置nginx的访问地址
  31. server_name localhost;
  32. #charset koi8-r;
  33. #access_log logs/host.access.log main;
  34. #地址映射
  35. #location / {
  36. # root html;
  37. # index index.html index.htm;
  38. #}
  39. #根据项目自定义设置
  40. location / {
  41. root ygmall-static;
  42. index index.html index.htm;
  43. }
  44. #error_page 404 /404.html;
  45. # redirect server error pages to the static page /50x.html
  46. #
  47. #指定错误页面
  48. error_page 500 502 503 504 /50x.html;
  49. location = /50x.html {
  50. root html;
  51. }
  52. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  53. #
  54. #location ~ \.php$ {
  55. # proxy_pass http://127.0.0.1;
  56. #}
  57. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  58. #
  59. #location ~ \.php$ {
  60. # root html;
  61. # fastcgi_pass 127.0.0.1:9000;
  62. # fastcgi_index index.php;
  63. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  64. # include fastcgi_params;
  65. #}
  66. # deny access to .htaccess files, if Apache's document root
  67. # concurs with nginx's one
  68. #
  69. #location ~ /\.ht {
  70. # deny all;
  71. #}
  72. }
  73. # another virtual host using mix of IP-, name-, and port-based configuration
  74. #
  75. #server {
  76. # listen 8000;
  77. # listen somename:8080;
  78. # server_name somename alias another.alias;
  79. # location / {
  80. # root html;
  81. # index index.html index.htm;
  82. # }
  83. #}
  84. # HTTPS server
  85. #
  86. #server {
  87. # listen 443 ssl;
  88. # server_name localhost;
  89. # ssl_certificate cert.pem;
  90. # ssl_certificate_key cert.key;
  91. # ssl_session_cache shared:SSL:1m;
  92. # ssl_session_timeout 5m;
  93. # ssl_ciphers HIGH:!aNULL:!MD5;
  94. # ssl_prefer_server_ciphers on;
  95. # location / {
  96. # root html;
  97. # index index.html index.htm;
  98. # }
  99. #}
  100. }

修改完毕后,在任务管理器中关闭所有nginx的进程,多查找几次,然后重启

十、项目日志管理

1、日志框架的概念

在项目开发、运维过程中,为了能够清晰的知道项目在服务器中的运行过程,便于查找服务器运行过程中的异常原因,我们需要对系统运行过程进行记录——运行日志

  1. 我们可以使用 控制台输出 的形式进行运行过程记录(不便于日志信息跟踪和维护、不能持久化存储)
  2. 控制台输出日志的诸多弊端催生了日志框架的诞生

日志框架 用于帮助我们在应用开发中完成日志记录的帮助类

日志框架作用

  1. 有结构的记录日志信息(结构是为了提升日志信息的可读性)
  2. 定义日志的输出策略(每个日志文件最大5m、每天一个日志文件)

2、日志框架规范

日志框架规范:日志记录实现的规则

日志框架:实现日志记录

11、Linux - 图14

  • 日志接口(日志框架规范)
    • JCL(Jakata Commons Logging)
    • SLF4J(Simple Logging Facade For Java)
    • JBoss Logging
  • 日志实现(日志框架)
    • Log4j
    • Logback

3、SLF4J

  • SLF4J(Simple Logging Facade For Java)简单日志门面,定义了一套日志规范,并不是日志解决方法
  • SLF4J的实现

11、Linux - 图15

4、slf4j-simple

  • 创建springboot项目
  • 添加依赖(如果不添加,springboot自带)

    1. <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
    2. <dependency>
    3. <groupId>org.slf4j</groupId>
    4. <artifactId>slf4j-simple</artifactId>
    5. <version>1.7.25</version>
    6. <scope>test</scope>
    7. </dependency>
  • 若使用上述依赖需要排除掉springboot中的依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-web</artifactId>
    4. <exclusions>
    5. <exclusion>
    6. <groupId>ch.qos.logback</groupId>
    7. <artifactId>logback-classic</artifactId>
    8. </exclusion>
    9. </exclusions>
    10. </dependency>
  • 创建对象
    ```java private Logger logger = LoggerFactory.getLogger(TestServiceImpl.class);

logger.info(“订单添加完成”);

  1. <a name="b969e32b"></a>
  2. ### 5、log4j使用介绍
  3. > log4j没有实现slf4j,如果基于slf4j规范使用log4j,则需要添加slf4j-log4j12依赖
  4. - 添加依赖
  5. ```xml
  6. <dependency>
  7. <groupId>org.slf4j</groupId>
  8. <artifactId>slf4j-log4j12</artifactId>
  9. <version>1.7.25</version>
  10. <scope>test</scope>
  11. </dependency>
  • 在resources目录下创建log4j.properties文件
    1. log4j.rootLogger=DEBUG,stdout
    2. # MyBatis logging configuration
    3. log4j.logger.org.mybatis.example.BlogMapper=TRACE
    4. # Console output...
    5. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    6. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    7. log4j.appender.stdout.layout.ConversionPattern=[%t] %5p - %n%m

6、基于SpringBoot应用的logback日志配置

SpringBoot默认整合了logback-classicri日志框架,我们需要配置这个logback框架以自定义日志输出格式、日志文件配置、日志文件保存策略等信息

创建一个**logback-spring.xml**文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  4. <encoder>
  5. <springProfile name="dev">
  6. <pattern>%d{yyyy-MM-dd-HH:mm:ss E} %level [%thread]-%class[%line]: %msg%n</pattern>
  7. </springProfile>
  8. <springProfile name="!dev">
  9. <pattern>%d{yyyy-MM-dd-HH:mm:ss E} %level [%thread]-%class[%line]: %msg%n</pattern>
  10. </springProfile>
  11. <!--日志的编码格式-->
  12. <charset>UTF-8</charset>
  13. </encoder>
  14. </appender>
  15. <!--这个就表示的是把日志输出到文件(FileAppender)-->
  16. <appender name="file" class="ch.qos.logback.core.FileAppender">
  17. <file>D:/log/output.log</file>
  18. <!--设置日志是否追加-->
  19. <append>true</append>
  20. <encoder>
  21. <pattern>%d{yyyy-MM-dd-HH:mm:ss:SSS} %level [%thread]-%class:%line>>%msg%n</pattern>
  22. <charset>UTF-8</charset>
  23. </encoder>
  24. <!--设置日志写入是否线程安全-->
  25. <prudent>false</prudent>
  26. </appender>
  27. <appender name="timeFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
  28. <!--TimeBasedRollingPolicy 基于时间的滚动策略-->
  29. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  30. <fileNamePattern>d:/log/log-%d{yyyy-MM-dd-HH}.log</fileNamePattern>
  31. </rollingPolicy>
  32. <encoder>
  33. <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n</pattern>
  34. <charset>UTF-8</charset>
  35. </encoder>
  36. </appender>
  37. <!--基于文件大小保存策略-->
  38. <appender name="fixedFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
  39. <file>d:/log/fixedFile.log</file>
  40. <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
  41. <fileNamePattern>log/fixedFile%i.log</fileNamePattern>
  42. <minIndex>1</minIndex>
  43. <maxIndex>10</maxIndex>
  44. </rollingPolicy>
  45. <!--SizeBasedTriggeringPolicy-->
  46. <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  47. <maxFileSize>5MB</maxFileSize>
  48. </triggeringPolicy>
  49. <encoder>
  50. <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n</pattern>
  51. <charset>UTF-8</charset>
  52. </encoder>
  53. </appender>
  54. <root level="info">
  55. <appender-ref ref="stdout"/>
  56. <appender-ref ref="timeFile"/>
  57. </root>
  58. </configuration>

在service实现类中创建logger对象

  1. private Logger logger= LoggerFactory.getLogger(OrderServiceImpl.class);
  2. logger.info("add order begin...");

配置文件中的路径可以使用相对路径:

去掉盘符会在根目录下生成

  1. <fileNamePattern>log/log-%d{yyyy-MM-dd-HH}.log</fileNamePattern>

十一、服务集群搭建

11.1、为什么要做服务器集群搭建?

服务器集群搭建介绍

11、Linux - 图16

11.2、服务器集群搭建架构说明

11.2.1、启动多个tomcat服务器

springboot应用只需要修改port —— 打包 ——运行

11.2.2、Nginx代理配置

参考9.1

11.3、负载均衡策略

前端/用户所有对tomcat(应用服务器)的请求都是通过Nginx转发的;

用户请求发送到nginx,nginx转发到对应的服务器,一个集群中有多个服务器节点,那么nginx是怎么确定转发到哪个服务器节点呢?

Nginx设置了对应的负载均衡策略,有4种内置的负载均衡策略,同时也支持配置第三方负载均衡策略

负载均衡策略:

策略 方式
轮询 默认方式
weight 权重方式
ip_hash 依据ip分配方式
least_conn 最少连接方式
fair(第三方) 响应时间方式
url_hash(第三方) 依据URL分配方式

11.3.1、轮询

轮询:根据用户的请求交替的发送到每个服务器节点,是nginx默认的负载均衡策略

参数:

  • max_fails:设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器停机
  • fail_timeout:与max_fails结合使用
  • fail_time:服务器会被认为停机的时间长度,默认为10s
  • backup:标记该服务器为备用服务器,当主服务器停止时,请求会被发送到它这里
  • down:标记服务器永久停机了
  1. upstream myservers{
  2. server localhost:8081 max_fails=3 fail_timeout=20s fail_time=100s;
  3. server localhost:8082;
  4. server localhost:8083;
  5. server localhost:8084 backup;
  6. server localhost:8085 down;
  7. }

11.3.2、权重

  1. upstream myservers{
  2. server localhost:8081 weight=1;
  3. server localhost:8082 weight=2;
  4. server localhost:8083 weight=1;
  5. }
  • 权重方式,在轮询策略的基础上指定轮询的几率
  • weight参数用于指定轮询的几率,weight的默认值为1,weight的数值与访问比率成正比
  • 权重越高分配到的处理越多
  • 此策略可以与least_conn和ip_hash结合使用
  • 此策略比较适合服务器的硬件配置差别比较大的情况

11.3.3、ip_hash

  • 指定负载均衡服务器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以确保session会话,这样每个访客都固定访问一个后端服务器,可以解决session下不能跨服务器问题
  1. upstream myservers{
  2. ip_hash #保证每一个访客固定访问一个后端服务器
  3. server localhost:8081 weight=1;
  4. server localhost:8082 weight=2;
  5. server localhost:8083 weight=1;
  6. }

11.3.4、least_conn

  • 把请求转发给连接数较少的后端服务器,轮询算法是把请求平均的转发给各个后端,使他们的负载大致相同;但是,有些请求占用的时间比较长,会导致其所在的后端负载比较高,这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
  1. upstream myservers{
  2. least_hash #把请求转发给连接数较少的后端服务器
  3. server localhost:8081 weight=1;
  4. server localhost:8082 weight=2;
  5. server localhost:8083 weight=1;
  6. }

十二、Docker部署

12.1、Docker安装

安装必要工具

  1. yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源*

  1. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

下载docker

  1. yum install -y docker-ce

启动docker

  1. systemctl start docker

12.2、安装并连接mysql

拉取镜像

  1. docker pull mysql

制作容器

  1. docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysql -d mysql

docker run:docker制作容器的命令

—name:取别名

-p:端口映射,容器端口映射到本机端口

-e:设置mysql的密码

-d:容器名称

查看运行容器

  1. docker ps

image.png

测试连接

测试连接之前需要开启安全组

关闭容器

  1. docker stop mysql

删除容器

  1. docker rm mysql

重启docker时也要重启Mysql

  1. docker run --name mysql --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysql -d mysql

12.3、安装redis

拉取镜像

  1. docker pull redis

制作容器

  1. docker run --name redis --restart=always -p 6379:6379 -d redis --requirepass "redis"

12.4、安装es

  1. 如果需要安装kibana等其他,需要创建一个网络,名字任意取,让他们在同一个网络,是的eskibana通信
  2. docker network create esnet
  3. docker pull elasticsearch:7.9.2
  4. docker run --name elasticsearch -p 9200:9200 -p 9300:9300 --network esnet -e "discovery.type=single-node" elasticsearch:7.9.2
  5. docker exec -it elasticsearch /bin/bash //进入elasticsearch容器
  6. //设置跨域
  7. vim config/elasticsearch.yml
  8. //添加以下内容并保存
  9. http.cors.enabled: true
  10. http.cors.allow-origin: "*"
  11. //安装ik分词器 版本对应
  12. elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.2/elasticsearch-analysis-ik-7.9.2.zip
  13. //退出容器
  14. exit
  15. //重启es
  16. docker restart elasticsearch
  17. docker pull mobz/elasticsearch-head:5
  18. docker run -d --name elasticsearch-head --net esnet -p 9100:9100 mobz/elasticsearch-head:5

12.5、安装rabbitmq

  1. docker pull rabbitmq:management //下载RabbitMQ对象
  2. docker run --name rabbit --restart=always -p 15672:15672 -p 5672:5672 -d rabbitmq:management //启动RabbitMQ,默认guest用户,密码也是guest

12.6、安装maxwell

  1. docker pull zendesk/maxwell //下载maxwell镜像
  2. docker run --name maxwell --restart=always -d zendesk/maxwell bin/maxwell --user='数据库用户名' --password='数据库密码' --host='IP地址' --producer=rabbitmq --rabbitmq_user='MQ用户名' --rabbitmq_pass='MQ用户' --rabbitmq_host='IP地址' --rabbitmq_port='5672' --rabbitmq_exchange='maxwell' --rabbitmq_exchange_type='fanout' --rabbitmq_exchange_durable='true' --filter='exclude: *.*,include: blog.tb_article.article_title = *, include: blog.tb_article.article_content = *,include: blog.tb_article.status = *' //运行MaxW