Linux入门二

一、磁盘管理

  • 当我们的主机插上磁盘之后,我们需要对磁盘进行分区,再创建文件系统,然后再进行磁盘挂载,挂载之后才能正常使用
1. 查看磁盘挂载的情况
命令: df

-a  显示所有磁盘
-h  单位转换
-T  详情

2. 磁盘分区
共有两种分区格式:MBR、GPT

MBR:MBR分区表(即主引导记录)大家都很熟悉。所支持的最大卷:2T,而且对分区有限制:最多4个主分区或3个主分区加一个扩展分区

GPT: GPT(即GUID分区表)。是源自EFI标准的一种较新的磁盘分区表结构的标准,是未来磁盘分区的主要形式。与MBR分区方式相比,具有如下优点。突破MBR 4个主分区限制,每个磁盘最多支持128个分区。支持大于2T的分区,最大卷可达18EB

分区工具:fdisk (fdisk 不支持GPT格式的分区,所以只能分2T以内的盘,2T以上用parted,parted支持GPT分区 )

语法: fdisk /dev/sdb  # /dev/sdb为自己要分区的盘
参数:
   a) d:删除一个(已经存在的)分区,其中d是delete的第1个字母。
  b) l:列出(已经存在的)分区的类型,其中l是list的第1个字母。
  c) m:列出fdisk中使用的所有命令,其中m是menu的第1个字母。
  d) n:添加一个新的分区,其中n是new的第1个字母。
  e) p:列出分区表的内容,其中p是print的第1个字母。
  f) q:退出fdisk,但是不存储所做的变化,其中q是quit的第1个字母。
  g) t:改变分区系统的id,其中t是title的第1个字母。
  h) w:退出fdisk并存储所做的变化,其中w是write的第1个字母。

3. 创建文件系统,即格式化分区  # 分区完成后,我们用对分区进行“装修”,之后
一般用xfs文件格式,ext4格式慢慢的要淘汰了
命令:mkfs.文件格式 分区目录
例:
mkfs.ext4 /dev/sdb1
mkfs.xfs /dev/sdb2

4. 文件系统挂载与卸载  # 注意:一个磁盘分区可以挂载到多个目录上,一个目录不要挂载多个磁盘分区
# 挂载的定义:挂载指将一个设备(通常是存储设备)挂接到一个已存在的目录上
文件挂载方法看下面的第二大块

5. 设置开机自动挂载(修改 /etc/fstab)
例:
vim /etc/fstab
/dev/sdb1 /data ext4 defaults,noatime 0 0
/dev/sdb2 /data2 ext4 defaults,noatime 0 0

二、文件挂载

1. 挂载命令-mount

  • 文件挂载有什么用
    • 挂载指将一个设备(通常是存储设备)挂接到一个已存在的目录上,这样我们就能通过文件系统,操作这个设备(读写数据)。文件挂载可以挂载本地设备,也可以挂载网络共享的设备(如nfs)
  • 文件挂载的特点
    • 当一个目录被多次挂载时,该目录下内容,以最后一次挂载的设备为主,该目录下之前的文件存放在之前某次挂载的设备上
    • 一个设备可以同时被挂载到多个目录下,但同一目录下的内容只以最后一次挂载的设备为主
    • 文件挂载只与目录有关,其父目录是否挂载设备、挂载什么设备无影响
  • 挂载方法
命令格式:mount [-afFhnrswvV] [-L 标签] [-t vfstype] [-o options] device dir

常用的几种写法:
mount [-hvV]  # 查看版本、挂载信息
mount [-afFhnrswvV] [-t vfstype]  # 挂载/etc/fstab中设置
mount [-fnrsvw] [-L 标签] [-t vfstype] [-o options] device dir  # 挂载指定的设备

其中:第一、二、三、四段参数顺序可以任意排列,且都是选填参数

1. 第一段参数:-afFhnrswvV

-h 显示在线帮助信息
-v:显示较讯息,通常和 -f 用来除错
-V:显示程序版本

-a 加载文件/etc/fstab中设置的所有设备
-f 不实际加载设备,可与-v等参数同时使用以查看mount的执行过程
-F 需与-a参数同时使用。所有在/etc/fstab中设置的设备会被同时加载,可加快执行速度
-n 一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料,加上 -n 不将加载信息记录在/etc/mtab文件中
-s-r 等于 -o ro
-w 等于 -o rw


2. 第二段参数:-L 标签
	将含有特定标签的硬盘分割挂上,不常用,因为一般不给文件系统设标签

3.第三段参数-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。
常用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs

4. 第四段参数:-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集

5. device 要挂接(mount)的设备

6. dir设备在系统上的挂接点,即目录(mount point)

例:
# 对ntfs格式的磁盘分区应使用-t ntfs 参数,对fat32格式的磁盘分区应使用-t vfat参数。若汉字文件名显示为乱码或不显示,可以使用下面的命令格式
mount -t ntfs -o iocharset=cp936 /dev/sdc1 /mnt/usbhd1
mount -t vfat -o iocharset=cp936 /dev/sdc5 /mnt/usbhd2

2. 挂载示例

(1)挂载光盘镜像文件

1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。
#cp /dev/cdrom /home/sunky/mydisk.iso 或
#dd if=/dev/cdrom of=/home/sunky/mydisk.iso
注:执行上面的任何一条命令都可将当前光驱里的光盘制作成光盘镜像文件/home/sunky/mydisk.iso
2、将文件和目录制作成光盘镜像文件,执行下面的命令。
#mkisofs -r -J -V mydisk -o /home/sunky/mydisk.iso /home/sunky/ mydir
注:这条命令将/home/sunky/mydir目录下所有的目录和文件制作成光盘镜像文件/home/sunky/mydisk.iso,光盘卷标为:mydisk
3、光盘镜像文件的挂接(mount)
#mkdir /mnt/vcdrom
注:建立一个目录用来作挂接点(mount point)
#mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom
注:使用/mnt/vcdrom就可以访问盘镜像文件mydisk.iso里的所有文件了

(2)挂载移动硬盘

对linux系统而言,USB接口的移动硬盘是当作SCSI设备对待的。插入移动硬盘之前,应先用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。
[root at pldyrouter /]# fdisk -l
接好移动硬盘后,再用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况.应该可以发现多了一个SCSI硬盘/dev/sdc和它的两个磁盘分区/dev /sdc1?、/dev/sdc2,其中/dev/sdc5是/dev/sdc2分区的逻辑分区。我们可以使用下面的命令挂接/dev/sdc1和 /dev/sdc5。
#mkdir -p /mnt/usbhd1
#mkdir -p /mnt/usbhd2
注:建立目录用来作挂接点(mount point)
#mount -t ntfs /dev/sdc1 /mnt/usbhd1
#mount -t vfat /dev/sdc5 /mnt/usbhd2
注:对ntfs格式的磁盘分区应使用-t ntfs 参数,对fat32格式的磁盘分区应使用-t vfat参数。若汉字文件名显示为乱码或不显示,可以使用下面的命令格式。
#mount -t ntfs -o iocharset=cp936 /dev/sdc1 /mnt/usbhd1
#mount -t vfat -o iocharset=cp936 /dev/sdc5 /mnt/usbhd2
linux系统下使用fdisk分区命令和mkfs文件系统创建命令可以将移动硬盘的分区制作成linux系统所特有的ext2、ext3格式。这样,在linux下使用就更方便了。使用下面的命令直接挂接即可。
#mount /dev/sdc1 /mnt/usbhd1

(3)挂载U盘

和USB接口的移动硬盘一样对linux系统而言U盘也是当作SCSI设备对待的。使用方法和移动硬盘完全一样。插入U盘之前,应先用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。
[root at pldyrouter root]# fdisk -l
插入U盘后,再用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。
[root at pldyrouter root]# fdisk -l
系统多了一个SCSI硬盘/dev/sdd和一个磁盘分区/dev/sdd1,/dev/sdd1就是我们要挂接的U盘。
#mkdir -p /mnt/usb
注:建立一个目录用来作挂接点(mount point)
#mount -t vfat /dev/sdd1 /mnt/usb
注:现在可以通过/mnt/usb来访问U盘了, 若汉字文件名显示为乱码或不显示,可以使用下面的命令。
#mount -t vfat -o iocharset=cp936 /dev/sdd1 /mnt/usb

(4)挂载Windows文件共享

Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba 软件包。现在流行的linux发行版绝大多数已经包含了samba软件包,如果安装linux系统时未安装samba请首先安装samba。当然也可以到 www.samba.org网站下载……新的版本是3.0.10版。
当windows系统共享设置好以后,就可以在linux客户端挂接(mount)了,具体操作如下:
# mkdir –p /mnt/samba
注:建立一个目录用来作挂接点(mount point)
# mount -t smbfs -o username=administrator,password=pldy123 //10.140.133.23/c$ /mnt/samba
注:administrator 和 pldy123 是ip地址为10.140.133.23 windows计算机的一个用户名和密码,c$是这台计算机的一个磁盘共享
如此就可以在linux系统上通过/mnt/samba来访问windows系统磁盘上的文件了。以上操作在redhat as server 3、redflag server 4.1、suse server 9以及windows NT 4.0、windows 2000、windows xp、windows 2003环境下测试通过

(5)挂载UNIX系统NFS文件共享

类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统),下面我们就以SUN Solaris2.8和REDHAT as server 3 为例简单介绍一下在linux下如何mount nfs网络共享。
在linux客户端挂接(mount)NFS磁盘共享之前,必须先配置好NFS服务端。

1、Solaris系统NFS服务端配置方法如下:
(1)修改 /etc/dfs/dfstab, 增加共享目录
share -F nfs -o rw /export/home/sunky
(2)启动nfs服务
# /etc/init.d/nfs.server start
(3)NFS服务启动以后,也可以使用下面的命令增加新的共享
# share /export/home/sunky1
# share /export/home/sunky2
注:/export/home/sunky和/export/home/sunky1是准备共享的目录

2、linux系统NFS服务端配置方法如下:
(1)修改 /etc/exports,增加共享目录
/export/home/sunky 10.140.133.23(rw)
/export/home/sunky1 *(rw)
/export/home/sunky2 linux-client(rw)
注:/export/home/目录下的sunky、sunky1、sunky2是准备共享的目录,10.140.133.23、*、 linux-client是被允许挂接此共享linux客户机的IP地址或主机名。如果要使用主机名linux-client必须在服务端主机 /etc/hosts文件里增加linux-client主机ip定义。格式如下:
10.140.133.23 linux-client
(2)启动与停止NFS服务
/etc/rc.d/init.d/portmap start (在REDHAT中PORTMAP是默认启动的)
/etc/rc.d/init.d/nfs start 启动NFS服务
/etc/rc.d/init.d/nfs stop 停止NFS服务
注:若修改/etc/export文件增加新的共享,应先停止NFS服务,再启动NFS服务方能使新增加的共享起作用。使用命令exportfs -rv也可以达到同样的效果。

3、linux客户端挂接(mount)其他linux系统或UNIX系统的NFS共享
# mkdir –p /mnt/nfs
注:建立一个目录用来作挂接点(mount point)
#mount -t nfs -o rw 10.140.133.9:/export/home/sunky /mnt/nfs
注:这里我们假设10.140.133.9是NFS服务端的主机IP地址,当然这里也可以使用主机名,但必须在本机/etc/hosts文件里增加服务端ip定义。/export/home/sunky为服务端共享的目录。

如此就可以在linux客户端通过/mnt/nfs来访问其它linux系统或UNIX系统以NFS方式共享出来的文件了。以上操作在 redhat as server 3、redflag server4.1、suse server 9以及Solaris 7、Solaris 8、Solaris 9 for x86&sparc环境下测试通过

(6)补充

linux加载光驱
(1)使用光驱前,要先mount一下:#mount /dev/cdrom /mnt/cdrom,然后您就可以进入/mnt/cdrom目录下读取光盘内容了;
(2)当您想退出光盘时,须使用umout命令,否则光驱就会一直处于死锁状态:#umount /mnt/cdrom

3. 卸载已挂载的设备-umount

命令:umount [-afhlnrvV] [-t <文件系统类型>] [文件系统]

参数:
-a 卸除/etc/mtab中记录的所有文件系统
-f 强制卸载,即使文件系统正忙
-h 显示帮助。
–l 延迟卸载,并不是马上umount,而是在该目录空闲后再umount
-n 卸除时不要将信息存入/etc/mtab文件中。
-r 若无法成功卸除,则尝试以只读的方式重新挂入文件系统
-t<文件系统类型> 仅卸除选项中所指定的文件系统
-v 执行时显示详细的信息
-V 显示版本信息
[文件系统] 除了直接指定文件系统外,也可以用设备名称或挂入点来表示文件系统

实例:
1. 下面两条命令分别通过设备名和挂载点卸载文件系统,同时输出详细信息
# umount -v /dev/sda1          通过设备名卸载  
/dev/sda1 umounted  
# umount -v /mnt/mymount/      通过挂载点卸载  
/tmp/diskboot.img umounted 

2. 如果设备正忙,卸载即告失败。卸载失败的常见原因是,某个打开的shell当前目录为挂载点里的某个目录
# umount -v /mnt/mymount/  
umount: /mnt/mymount: device is busy  
umount: /mnt/mymount: device is busy 
        
3. 当卸载遇到设备正被使用时,可以通过以下三种方法进行卸载

(1)使用 -l 参数 :–l 并不是马上umount,而是在该目录空闲后再umount

(2)用ps aux 先查看占用设备的程序的PID,然后杀死进程后再unmount
fuser -m -v /nfs_old/
             用户  进程号  权限   命令
/nfs_old/:   root  2699    ..c..  bash
          	 root  2999    ..c..  su
如上所示,有两个进程占用了,将其kill掉,再重新取消挂载。
kill -9 2699 2999
umount /nfs_old/

(3)强制卸载
使用参数 -f

三、软硬链接

  • 类似于windows中快捷方式,也是一种文件,用于存放源文件的路径(位置+名字),最常用
  • 硬链接:在同一个分区(文件系统)中文件的inode号码相同,这些文件互为硬链接,很少使用
1. 创建软连接
ln -s 源文件或目录 软连接文件或目录

# 注意1:创建软连接,尽量用全路径,全路径的软连接,将链接文件移动后,依然可以指向源文件,如果用相对路径做的软连接,把链接文件移动之后,就无法指向源文件了,因为指向的是相对路径,所以就无法使用了

# 注意2:创建软连接时,软连接的文件或目录不能存在源文件相同名字的文件、源目录相同名字的目录,否则无法创建软连接,会报文件或目录已存在

# 注意3:其中软链接是指向原始文件的实际链接,也称为符号链接。这些链接将具有不同的Inodes值。软链接指向原始文件,因此如果原始文件被删除,则软链接将失败。如果删除软链接,文件将不会发生任何变化。这样做的原因是,实际文件或目录的inode与"软链接"创建的文件的inode不同。软链接可以跨文件系统,即可以跨区


2. 创建硬链接:
ln 源文件 硬链接文件

# 注意:硬链接的作用类似于原始文件的镜像副本。这些链接共享相同的 inode。对原始文件或硬链接文件所做的更改将反映在不同的文件中。删除硬链接时,其他文件不会发生任何变化。硬链接不能跨文件系统,即不能跨区

3. 软硬链接的区别:
删除源文件,软连接不能用了,硬链接还可以用
硬链接空间占用一样,block和inode都一样,软连接也占很少空间
硬链接及时防止误删除,无法防止误修改,所以用的很少,用的多的是复制
目录无法创建硬链接,软连接可以
硬链接只能在同分区下

4. 查看文件或目录是否有创建链接

ls -l 文件或目录  即可查看

5. 修改软连接  # 这里修改是指修改软链接的目标目录
ln -snf 【新目标目录】 【软链接地址】

6. 删除软连接,不会影响源文件
rm 【软连接的目录或文件】

使用rm 命令删除软链接的 软连接文件或目录 即可,删除目录时,最后不能跟 "/"
如: 
ln -s /jtnas/products/data/JT79GOXO/ /home/jt/hsw_test
cd /home/jt/hsw_test
rm JT79GOXO  # JT79GOXO为目录,最后不加 /  ,加斜杠就相当于普通的删除目录了

四、nfs服务

1. 什么是NFS

  • 介绍
    • NFS 是Network File System的缩写,即网络文件系统
    • 功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法
    • NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享
    • NFS在文件传送或信息传送过程中依赖于RPC协议。RPC远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输
    • 通常制作NFS服务之后,再搭配文件挂载进行使用

2. 服务端配置NFS

  • 步骤:
    • 安装nfs服务的依赖包
      • yum install rpcbind nfs-utils -y
    • 修改配置文件/etc/exports

(1)配置

NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,
可能要使用vim手动建立,然后在文件里面写入配置内容


/etc/exports文件内容格式:

<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
# 例如:/hdfs/jtdata/products/data *(ro,sync,fsid=0,no_root_squash)
# fsid=0 选项的时候只能共享一个目录,且指定/hdfs/jtdata/products/data 为nfs的根目录

-输出目录  输出目录是指NFS系统中需要共享给客户机使用的目录
-客户端    客户端是指网络中可以访问这个NFS输出目录的计算机,可以是固定ip,也可以是一个网段

	客户端常用的指定方式
		指定ip地址的主机:192.168.0.200
		指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
		指定域名的主机:david.bsmart.cn
		指定域中的所有主机:*.bsmart.cn
		所有主机:*
        
-选项      选项用来设置输出目录的访问权限、用户映射等 

	NFS主要有3类选项:
		1. 访问权限选项
			设置输出目录只读:ro
			设置输出目录读写:rw
        2. 用户映射选项
        	all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
			no_all_squash:与all_squash取反(默认设置);
            root_squash:表示客户机用root用户访问该共享目录时,将root用户映射为匿名用户或用户组(默认设置);
            no_root_squash:来访的root用户保持root帐号权限;
            anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
            anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx)
		3. 其他选项         
            secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
            insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
            sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
            async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
            wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
            no_wdelay:若有写操作则立即执行,应与sync配合使用;
            subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
            no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率     

(2)共享目录的权限

  • 在上面的配置文件中,配置了读写权限,共享给客户端之后,客户端可能仍然无法对该共享目录进行操作,因为此时该目录在本机操作系统的权限还没开启(使用ls -l 共享目录 查看操作系统权限)
  • 若没有权限,则使用chmod -R o+w 共享目录给其他用户组添加写权限
  • 不过一般共享是只共享可读权限,基本不会出现上述情况

(3)启动nfs服务

1. 启动nfx服务(*****必须先启动rpcbind服务*****)
systemctl start rpcbind.service
systemctl start nfs-server.service

2. 查看启动状态(查看rpcbind端口是否开启,rpcbind服务默认使用tcp端口111)
[root@MiWiFi-R3-srv ~]# netstat -anpt |grep rpcbind

3. 查看本机发布的NFS共享目录
[root@MiWiFi-R3-srv ~]# showmount -e  # # 默认查看自己共享的服务,前提是要DNS能解析自己,不然容易报错
结果:
Export list for jt-hdfs-78:
/hdfs/jtdata/products/data *

showmount -a  # 显示已经与客户端连接上的目录信息
结果:
All mount points on jtc2-74:

4. 制作开机自启
systemctl enable rpcbind.service
systemctl enable nfs-server.service

5. 扩展(exportfs命令)

exportfs [params]
 -a:全部挂载(或卸载) /etc/exports文件设定
 -r:重新挂载 /etc/exports设定,也可以同步更新/etc/exports设定
 -u:卸载某一目录
 -v:在export时,将共享目录显示在屏幕上

exportfs -rv  # NFS Server上重新挂载exports内容(一般用在更改过exports,但又不想重新启动机器的时候)
exportfs -au  # 卸载全部mount 目录,这样在NFS Client上将看不到原来mount的目录
exportfs -v   # 显示本机的共享目录

3. 客户端挂载NFS

1. 客户端也要安装依赖的包
yum install rpcbind nfs-utils -y

2. 启动服务
systemctl enable rpcbind.service && systemctl start rpcbind.service

3. showmount -e NFS服务器IP  # 检查 NFS 服务器端是否有目录共享

4. 挂载nfs目录
mount -t nfs 192.168.31.106:/share /hsw/test

五、nginx服务

  • 能提供反向代理服务有Apache和nginx,nginx更为轻型,配置简便,现在最常用的
  • nginx提供了反向代理 和 负载均衡功能,有了nginx之后我们就能实现服务端的集群部署,大幅提高服务端的并发
  • nginx官方在线文档
  • nginx的四种负载均衡方式
    • 轮询
    • 最小连接数
    • ip_hash(用于会话保持,使某一ip最近一段时间的访问全部分配到同一个服务器,现在很多保持会话的方式已经不需要定位同一个不变的服务器了,如 通过算法签发token、或者将登录状态保存到数据库)
    • weight(其实是在轮询的基础上,提高某个权重高的服务器的分发请求频率)

1. nginx安装

1. yum -y install pcre  pcre-devel zlib  zlib-devel openssl openssl-devel 

# PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库

# zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库

# OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库

2. yum install nginx -y

# nginx本身

2. nginx配置

  • nginx.conf配置文件中的内容分为三个部分

    • 第一部分:全局块(全局设置), 作用域是全局

    • 第二部分:events块(nginx的工作模式)

    • 第三部分:http块(请求设置),http模块中包含server模块设置,server中包含location模块设置

  • 常配置的模块有 events模块、http模块、server模块

    • events模块设置nginx的工作模式
    • HTTP模块控制着nginx http处理的所有核心特性,联合server模块配置反向代理和负载均衡的方式
    • server模块包含所有的服务器网站的设置
配置 nignx的配置文件  /etc/nginx/nginx.conf

1. 全局配置

user  jt
worker_process auto; 
error_log /var/log/nginx/error.log;
pid /run/ngin.pid;
keepalive_timeout 10; 
client_header_timeout 10; 
client_body_timeout 10; 
reset_timedout_connection on; 
send_timeout 10;
limit_conn_zone $binary_remote_addr zone=addr:5m; 
limit_conn addr 100;

user  # Nginx用户及组:用户 组。window下不指定

worker_process auto  # 表示工作进程的数量,一般设置为cpu的核数,默认auto即可

error_log  # 告诉nginx只能记录严重的错误

keepalive_timeout  # 给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让ngnix持续工作的时间更长。

client_header_timeout 和 client_body_timeout  # 设置请求头和请求体(各自)的超时时间。我们也可以把这个设置低些。

reset_timeout_connection  # 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。

send_timeout  # 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接

limit_conn_zone  # 设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。

limit_conn  # 为给定的key设置最大连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接


2. events模块

events { 
    worker_connections 2048; 
    multi_accept on; 
    use epoll; 
}

worker_connections 设置可由一个worker进程同时打开的最大连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。记住,最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处

multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接

3. http模块
# 因为这里只有很少的配置,所以我们只节选配置的一小部分。所有这些设置都应该在http模块中,甚至你不会特别的注意到这段设置

http { 
    log_format my_log1 '$remote_addr - $remote_user ... ';
    access_log /var/log/nginx/error.log my_log1;
    server_tokens off; 
    sendfile on; 
    tcp_nopush on; 
    tcp_nodelay on; 
    ... 
}

log_format  # 记录日志的格式,可以有多个

access_log  # 设置nginx是否将存储访问日志,以及使用的日志格式。关闭这个选项可以让读取磁盘IO操作更快

server_tokens  # 并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。

sendfile  # 可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。

tcp_nopush  # 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。

tcp_nodelay  # 告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值

4. server模块  # server 块可以有多个

server { 
    
    listener 80; 
    server_name www.hsw_test.com; 
    root /my_project1; 

    location / {
        root /my_project2;
        index index.html index2.html index3.html;
        }
    
    location ^~ /img/ {
        root /my_project3;
        index index4.html ;
        }
    
    ...
} 

listener   # 监听端口
server_name  # 监听域名或者主机ip


5. location 块  # 一个server块中,location块也可以有多个

location中与server中同名的配置,会覆盖server的配置

location 匹配表达式 {}  # 是用来为匹配的 URI 进行配置,URI 即语法中的“/url/”,

location / {}  # 匹配任何查询,因为所有请求都以 / 开头。匹配符合以后,还要继续往下搜索,只有后面的正则表达式没有匹配到时,这一条才会采用这一条

root  # 本地网站的根目录,通常配置我们项目代码的父目录。如:客户端请求 www.hsw_test.com/a/b/c.html 时,实际客户端请求的地址为: 服务器ip:80/my_project2/a/b/c.html
        
index  # 指定首页index文件的名称,可以配置多个,以空格分开。可以有多个,多个则按从左到右的顺序查找。用于用户直接访问域名,后面啥也不跟时,会定位到index。如:客户端请求 www.hsw_test.com 时,实际客户端请求的地址为: 服务器ip:80/my_project2/index.html

location ^~ /img/ {}  # ^~ 表优先前缀匹配,如果某个location块使用了^~修饰符,Nginx会优先匹配这个location,并且在找到匹配项后不再继续搜索其他location块,此处表示匹配到如:客户端请求 www.hsw_test.com/img/adsf/... ,就会被匹配到

location = / {}  # 精确匹配 / ,请求的域名或ip后面不能带任何字符串

- location还有其他匹配规则,详情见 https://www.cnblogs.com/gaoyanbing/p/17335903.html

3. nginx反向代理、负载均衡配置

  • 访问nginx的服务器,nginx将会根据配置将请求转发到upstream中的某个服务器的某个端口
# 在http模块中配置负载均衡
http {
    	# 轮询
    	upstream myapp1 {
            server srv1.example.com;  # 或者ip加端口
            server srv2.example.com;
            server srv3.example.com;
    }
    	# 最小连接数
        upstream myapp2 {
            least_conn;
            server srv1.example.com;
            server srv2.example.com;
            server srv3.example.com;
    }
    	# ip_hash
    	upstream myapp3 {
            ip_hash;
            server srv1.example.com;
            server srv2.example.com;
            server srv3.example.com;
}		
    	# 权重
        upstream myapp4 {
            server srv1.example.com weight=3;
            server srv2.example.com;
            server srv3.example.com;
    }
    

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;  # 上面列出了4中负载均衡的配置 myapp1、myapp2、myapp3、myapp4。我们指定要使用的负载方式为myapp1
        }
    }
}

4. 多个server块

# 在http模块中配置多个server块
http {
    server {
        listen 80;
        server_name example1.com;
        
        location / {
            root /var/www/example1;
            index index.html;
        }
    }
    
    server {
        listen 80;
        server_name example2.com;
        
        location / {
            proxy_pass http://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

'''
上述配置文件定义了两个server块,分别对应于example1.com和example2.com这两个域名。第一个server块指定了该站点使用的根目录为/var/www/example1,并且默认打开index.html页面。而第二个server块则将所有请求转发到本地运行的Node.js应用程序,该应用程序监听在3000端口上。

需要注意的是,每个server块都必须指定listen参数来确定监听的端口号,并且还需要指定server_name参数来与特定的域名进行关联
'''

5. 简单服务的配置

user  hsw;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    #隐藏Header状态
    proxy_hide_header X-Powered-By;
    proxy_hide_header Server;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
server {
    listen 80;
    server_name hsw_test.com;
    location / {
        proxy_pass http://localhost:50000;
    	}

	}
}

6. nginx的启动和停止

1. 如果你使用的是 systemd 系统
systemctl start nginx  # 启动,首次启动,可能需要关闭操作系统防火墙,或者修改防火墙规则,客户端才能访问
systemctl disable firewalld  # 关闭防火墙

systemctl restart nginx  # 重启
systemctl reload nginx  # 最常用,可以不必关闭nginx,重新加载nginx配置
systemctl endisable nginx  # 设置nginx开机自启

systemctl stop nginx  # 停止

2. nginx执行文件操作(进入nginx可执行目录sbin下)
./nginx  # 启动nginx (需要先停止nginx,再进行启动)
./nginx -c ../conf/nginx.conf  # 以指定配置启动nginx,nginx.conf 为默认启动nginx时的配置(需要先停止nginx,再进行启动)

./nginx -s reload  # 可以不必关闭nginx,重新加载nginx配置

./nginx -s quit  # 待nginx进程处理任务完毕进行停止
./nginx -s stop  # 先查出nginx进程id再使用kill命令强制杀掉进程

./nginx -V  # 查看版本号
    
./nginx -t  # 验证nginx配置文件是否正确
'''
结果显示:
nginx.conf syntax is ok
nginx.conf test is successful
说明配置文件正确
'''
posted @ 2023-04-20 18:32  BigSun丶  阅读(119)  评论(0)    收藏  举报