ContOS使用vsftpd服务器的问题

一直都不适用vsftp,但是最近因为公司需要一个官网,所以才启动起来,安装vsftp很简单,可以搜索本站的资源“vsftpd”进行查阅,这个帖子只要是记录使用过程中的问题。

以前服务器的ContOS是6.5版本的,现在的版本是7.5,问题就随之而来了,以前出现过一次无法上传文件的问题,该问题是防火墙,帖子:“http://www.lanxinbase.com/?p=607”。

问题1:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()。

解答:这个问题是因为你在vsftpd目录下的chroot_list文件中加入了FTP的用户名,只要把它删除就可以了;也可以把写入的权限去掉:chmod a-w /www。或者你可以在vsftpd的配置文件中增加下列两项中的一项:allow_writeable_chroot=YES

造成这个原因是因为,如:我们新建了一个www的用户,目录指向/www,并给/www赋予了写入的权限,所有就出现了500的错误。而chroot_list文件列表是制定需要锁定用户在它当前根目录的一个权限文件。简单点,如果你给了写入的权限,而又限制用户只能在它当前的根目录下,这样子会造成冲突,比如我上传一个文件夹。

*注:以前也遇到过这个问题是selinux的问题,所以要排除一下。

问题2:修改vsftp用户目录的问题。

解答:修改用户信息,使用usermod命令,其参数:

[root@iZ2zed1931stl3pem7ew6vZ vsftpd]# usermod –help
Usage: usermod [options] LOGIN

Options:
-c, –comment COMMENT new value of the GECOS field
-d, –home HOME_DIR new home directory for the user account
-e, –expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE
-f, –inactive INACTIVE set password inactive after expiration
to INACTIVE
-g, –gid GROUP force use GROUP as new primary group
-G, –groups GROUPS new list of supplementary GROUPS
-a, –append append the user to the supplemental GROUPS
mentioned by the -G option without removing
him/her from other groups
-h, –help display this help message and exit
-l, –login NEW_LOGIN new value of the login name
-L, –lock lock the user account
-m, –move-home move contents of the home directory to the
new location (use only with -d)
-o, –non-unique allow using duplicate (non-unique) UID
-p, –password PASSWORD use encrypted password for the new password
-R, –root CHROOT_DIR directory to chroot into
-s, –shell SHELL new login shell for the user account
-u, –uid UID new UID for the user account
-U, –unlock unlock the user account
-Z, –selinux-user SEUSER new SELinux user mapping for the user account

我就不翻译出来了,具体的自己拷贝到翻译软件里看一下就清楚了,但是这里主要介绍一下参数:-d、-u。

  • -d:new home directory for the user account(用户账号的新目录)
  • -u:new UID for the user account(用户的UID,应该就是唯一标识)

-d参数后面跟的目录很好解决,但是如果是-u的UID,你不知道是多少,那么可以使用命令: cat /etc/passwd |grep www

[root@iZ2zed1931stl3pem7ew6vZ vsftpd]# cat /etc/passwd |grep www
www:x:1000:1000::/www:/sbin/nologin

其中第一个1000就是UID,那么修改目录的命令,就应该如下:

usermod -m -d /www/home -u 1000 www;

usermod -d /www/home -m -u 1000 www;

*注:有些系统可能不需要-m的参数。

问题3:修改vsftp用户登陆密码。

解答:这个应该不是问题,就是:passwd www。

问题4:访问vsftp服务器出现200、227错误。

 

解答:ftp服务器有两种工作模式,port和pasv(主动和被动),这两种模式都是客户端先向服务器端发出请求,服务器建立链接,以服务器为对象,当传输数据时,如果是服务器从20端口向客户端空闲端口发送请求建立链接,就是port(主动),反之,如果是客户端向服务器空闲端口请求建立链接,就是pasv(被动)。

打开IE浏览器:选择设置—-internet—–高级—-使用被动FTP(为防火墙和DSL调制解调器兼容性)”前面的勾去掉。

001

 

问题5:450:读取目录列表失败。

解答:这个挺困扰的,我找了很久才发现,只需要在vsftp的配置文件vsftpd.conf加入pasv_enable=NO就可以了,接着重启一下服务器,引起整个原因是pasv的问题。

问题6:中文乱码的问题。

解答:中文乱码的问题其实我没有遇到过,网上的解决方案是改i18n,不过我们服务器的名称一般都是英文的,所以就不需要搭理它了。

问题7:530 Login incorrect.

解答:请检查一下密码是否输入错误。

问题8:550 外网无法登录。

解答:这个可能是没有开放tcp 20的端口,请检查一下防火墙规则配置文件。

问题9:其他问题。

这次出现过一次很奇葩的问题,但其实是FTP客户端的问题,我在登陆www账号的时候,FTP客户端居然把服务器“/”目录当成了用户的主目录,0.0吓死我了,搞了我一下午都没有找出问题来,后来第二天再登陆进去,发现正常了,根目录是/www,这就奇怪了,后来我再次改一下配置文件,然后换了不同的FTP客户端登陆,确定这个是客户端的问题。

所以遇到问题不要怕麻烦,一个个去排查就可以了。

 

 

 

Linux加载磁盘并分区

disk

fdisk [选项] <disk> 改变分区表

fdisk [选项] –l <disk> 列出所有分区表

fdisk –s <partition(分区编号)> 以分区块为单位,给出指定分区的大小

这是一个创建和维护分区的命令,兼容DOS类型的分区表、BSD或SUN类型的磁盘列表。注意fdisk不支持2T以上的硬盘分区,此时需要使用gdisk。

相关了解:

磁头数(Heads)表示硬盘有几个磁头,也就是有几面盘片,一个硬盘最多有255个磁头

柱面数(Cylinders)表示硬盘每面盘片上有几条磁道

扇区数(Sectors)表示每条磁道上有几个扇区,每条磁道最多有63个扇区

(1).参数

-b <size>  指定扇区大小(512,1024,2048或4096 B)
-c  关闭DOS兼容模式
-u <size>  以扇区编号取代柱面编号来表示每个分区的起始地址,一般与-l选项联合使用
-C <number>  指定柱面编号
-H <number>  指定磁头编号
-S <number>  指定磁道扇区编号

 

(2).菜单操作说明

a 设置可引导标记(活动分区/引导分区之间切换)
b 编辑BSD磁盘标签
c 设置DOS操作系统兼容标记(兼容/不兼容之间切换)
d 删除一个分区
l 显示已知的分区类型,其中82为Linux swap分区,83为Linux分区
m 显示帮助信息
n 增加一个新的分区
o 创建一个新的空白的DOS分区表
p 显示磁盘当前的分区表
q 退出fdisk程序,不保存任何修改
s 创建一个新的空白的Sun磁盘标签
t 改变一个分区的系统ID,就是改变分区类型(比如把Linux Swap分区改为Linux分区)
u 改变显示或输入单位
v 验证磁盘分区表
w 将分区表写入磁盘并退出(保存并退出)
x 额外功能(专家级)

注:使用fdisk <磁盘>可以进入到菜单操作,如:fdisk /dev/vdb

(3).磁盘分类

磁盘类型,从输出的文字区别,如/dev/vda 和 /dev/vdb 都是 virtio-block 类型的设备:
  • /dev/sda 是 sd 即 SCSI 类型的设备
  • fd:软盘驱动器
  • hd:IDE 磁盘
  • sd:SCSI 磁盘
  • tty:terminals
  • vd:virtio 磁盘

(3).例子

  • 使用-l选项,列出所有分区表

[root@iZ2zed1931stl3pem7ew6vZ /]# fdisk -l

Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a57df

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83884031 41940992 83 Linux

Disk /dev/vdb: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

我这台linux有两个磁盘,一个是/dev/vda共42.9GB,另一个是/dev/vdb共64.4GB。

  • 使用-l和-u选项,以扇区编号取代柱面编号来表示每个分区的起始地址

[root@iZ2zed1931stl3pem7ew6vZ /]# fdisk -lu

Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a57df

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83884031 41940992 83 Linux

Disk /dev/vdb: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

  • fdisk主要的菜单操作

[root@iZ2zed1931stl3pem7ew6vZ /]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x90e7133d.

Command (m for help):

分区操作(扩展分区):

[root@iZ2zed1931stl3pem7ew6vZ /]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x90e7133d.

Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): e
Partition number (1-4, default 1): 1
First sector (2048-125829119, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-125829119, default 125829119):
Using default value 125829119
Partition 1 of type Extended and of size 60 GiB is set

Command (m for help): p

Disk /dev/vdb: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x90e7133d

Device Boot Start End Blocks Id System
/dev/vdb1 2048 125829119 62913536 5 Extended

写入磁盘(保存):

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

此时在分一个逻辑分区:

[root@iZ2zed1931stl3pem7ew6vZ /]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): n
Partition type:
p primary (0 primary, 1 extended, 3 free)
l logical (numbered from 5)
Select (default p): 1
Invalid partition type `1′

Command (m for help): n
Partition type:
p primary (0 primary, 1 extended, 3 free)
l logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (4096-125829119, default 4096):
Using default value 4096
Last sector, +sectors or +size{K,M,G} (4096-125829119, default 125829119):
Using default value 125829119
Partition 5 of type Linux and of size 60 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@iZ2zed1931stl3pem7ew6vZ /]#

 

至此,分区完毕,使用fdisk -l查看磁盘分区:

[root@iZ2zed1931stl3pem7ew6vZ /]# fdisk -l

Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a57df

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83884031 41940992 83 Linux

Disk /dev/vdb: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x90e7133d

Device Boot Start End Blocks Id System
/dev/vdb1 2048 125829119 62913536 5 Extended
/dev/vdb5 4096 125829119 62912512 83 Linux

最后的/dev/vdb1就是刚刚分区的扩展分区,/dev/vdb5 是逻辑分区,但是还没有挂载到系统中。

Linux mount命令

Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。

语法

mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

参数说明:

  • -V:显示程序版本
  • -h:显示辅助讯息
  • -v:显示较讯息,通常和 -f 用来除错。
  • -a:将 /etc/fstab 中定义的所有档案系统挂上。
  • -F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
  • -f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
  • -n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
  • -s-r:等于 -o ro
  • -w:等于 -o rw
  • -L:将含有特定标签的硬盘分割挂上。
  • -U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
  • -t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
  • -o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
  • -o sync:在同步模式下执行。
  • -o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
  • -o auto、-o noauto:打开/关闭自动挂上模式。
  • -o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
  • -o dev、-o nodev-o exec、-o noexec允许执行档被执行。
  • -o suid、-o nosuid:
  • 允许执行档在 root 权限下执行。
  • -o user、-o nouser:使用者可以执行 mount/umount 的动作。
  • -o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
  • -o ro:用唯读模式挂上。
  • -o rw:用可读写模式挂上。
  • -o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。

(1).例子:

将/dev/vdb1挂在 /ww2 之下

[root@iZ2zed1931stl3pem7ew6vZ /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 4.9G 33G 14% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 600K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 379M 0 379M 0% /run/user/0

首先使用df -h查看一下,当前的分区情况,然后再使用mount挂载分区:

[root@iZ2zed1931stl3pem7ew6vZ /]# mount /dev/vdb1 /ww2
mount: /dev/vdb1 is write-protected, mounting read-only
mount: unknown filesystem type ‘(null)’

//这里出错了,因为没有格式化,下面在试一次:

[root@iZ2zed1931stl3pem7ew6vZ /]# mkfs.ext4 /dev/vdb
vdb vdb1 vdb5
[root@iZ2zed1931stl3pem7ew6vZ /]# mkfs.ext4 /dev/vdb5
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
3932160 inodes, 15728128 blocks
786406 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2164260864
480 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

[root@iZ2zed1931stl3pem7ew6vZ /]#

挂载分区:

[root@iZ2zed1931stl3pem7ew6vZ /]# mount /dev/vdb5 /ww2
[root@iZ2zed1931stl3pem7ew6vZ /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 4.9G 33G 14% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 604K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 379M 0 379M 0% /run/user/0
/dev/vdb5 59G 53M 56G 1% /ww2

/dev/vdb5 59G 53M 56G 1% /ww2指向了ww2的目录,这样子挂载是临时的,如果需要下次开机自动挂载磁盘,就需要修改/etc/fstab文件。

linux环境jdk安装

1.下载jdk-8u161-linux-x64.tar.gz文件,我是从官网下载的
2.文件解压,并移动到特定目录中,为了方便管理,我整理移动到/usr/local目录下:

[root@iZ2zed1931stl3pem7ew6vZ tools]# tar -zxvf jdk-8u161-linux-x64.tar.gz
[root@iZ2zed1931stl3pem7ew6vZ tools]# mv ./jdk1.8.0_161/ /usr/local/jdk/

3.配置/etc/profile文件,并且使用vim打开配置文件。
在文件底部添加一下代码:

export JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

注:/usr/local/jdk是你实际的目录

4.执行source命令,profile文件重新读入到内存。

[root@iZ2zed1931stl3pem7ew6vZ tools]# source /etc/profile

5.检查一下java版本号

[root@iZ2zed1931stl3pem7ew6vZ tools]# java -version
java version “1.8.0_161″
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

这样子就搞定了.

 

 

Nginx 配置文件 nginx.conf 详解

#定义Nginx运行的用户和用户组

user www www;

 

#nginx进程数,建议设置为等于CPU总核心数。

worker_processes 8;

 

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

error_log /var/log/nginx/error.log info;

 

#进程文件

pid /var/run/nginx.pid;

 

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。

worker_rlimit_nofile 65535;

 

#工作模式与连接数上限

events

{

#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。

use epoll;

#单个进程最大连接数(最大连接数=连接数*进程数)

worker_connections 65535;

}

 

#设定http服务器

http

{

include mime.types; #文件扩展名与文件类型映射表

default_type application/octetstream; #默认文件类型

#charset utf-8; #默认编码

server_names_hash_bucket_size 128; #服务器名字的hash表大小

client_header_buffer_size 32k; #上传文件大小限制

large_client_header_buffers 4 64k; #设定请求缓

client_max_body_size 8m; #设定请求缓

sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。

autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。

tcp_nopush on; #防止网络阻塞

tcp_nodelay on; #防止网络阻塞

keepalive_timeout 120; #长连接超时时间,单位是秒

 

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

 

#gzip模块设置

gzip on; #开启gzip压缩输出

gzip_min_length 1k; #最小压缩文件大小

gzip_buffers 4 16k; #压缩缓冲区

gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)

gzip_comp_level 2; #压缩等级

gzip_types text/plain application/xjavascript text/css application/xml;

#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。

gzip_vary on;

#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

 

upstream blog.ha97.com {

#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。

server 192.168.80.121:80 weight=3;

server 192.168.80.122:80 weight=2;

server 192.168.80.123:80 weight=3;

}

 

#虚拟主机的配置

server

{

    #监听端口

    listen 80;

    #域名可以有多个,用空格隔开

    server_name www.ha97.com ha97.com;

    index index.html index.htm index.php;

    root /data/www/ha97;

    location ~ .*\.(php|php5)?$

    {

    fastcgi_pass 127.0.0.1:9000;

    fastcgi_index index.php;

    include fastcgi.conf;

    }

    #图片缓存时间设置

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

    {

    expires 10d;

    }

    #JS和CSS缓存时间设置

    location ~ .*\.(js|css)?$

    {

    expires 1h;

    }

    #日志格式设定

    log_format access ‘$remote_addr – $remote_user [$time_local] “$request” ‘

    ‘$status $body_bytes_sent “$http_referer” ‘

    ‘”$http_user_agent” $http_x_forwarded_for’;

    #定义本虚拟主机的访问日志

    access_log /var/log/nginx/ha97access.log access;

 

    #对 “/” 启用反向代理

    location / {

    proxy_pass http://127.0.0.1:88;

    proxy_redirect off;

    proxy_set_header XRealIP $remote_addr;

    #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

    proxy_set_header XForwardedFor $proxy_add_x_forwarded_for;

    #以下是一些反向代理的配置,可选。

    proxy_set_header Host $host;

    client_max_body_size 10m; #允许客户端请求的最大单文件字节数

    client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,

    proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)

    proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)

    proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)

    proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小

    proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置

    proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)

    proxy_temp_file_write_size 64k;

    #设定缓存文件夹大小,大于这个值,将从upstream服务器传

    }

 

    #设定查看Nginx状态的地址

    location /NginxStatus {

    stub_status on;

    access_log on;

    auth_basic “NginxStatus”;

    auth_basic_user_file conf/htpasswd;

    #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。

    }

 

    #本地动静分离反向代理配置

    #所有jsp的页面均交由tomcat或resin处理

    location ~ .(jsp|jspx|do)?$ {

    proxy_set_header Host $host;

    proxy_set_header XRealIP $remote_addr;

    proxy_set_header XForwardedFor $proxy_add_x_forwarded_for;

    proxy_pass http://127.0.0.1:8080;

    }

    #所有静态文件由nginx直接读取不经过tomcat或resin

    location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$

    { expires 15d; }

    location ~ .*.(js|css)?$

    { expires 1h; }

}

}

高性能的HTTP服务Nginx还能做什么?

Nginx能做什么?
1、反向代理
2、负载均衡
3、HTTP服务器(包含动静分离)
4、正向代理

以上是Nginx在不依赖第三方模块能处理的事情,下面详细解说一下:

1.反向代理
反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

下面贴上一段简单的实现反向代理的代码

server {
        listen       80;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;

        location / {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host:$server_port;
        }
    }

保存配置文件后启动Nginx,这样当我们访问localhost的时候,就相当于访问localhost:8080了;

2.负载均衡
负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

  • 2.1 RR(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除,简单配置如下:

upstream test {
    server localhost:8080;
    server localhost:8081;
}
server {
    listen       81;                                                         
    server_name  localhost;                                               
    client_max_body_size 1024M;

    location / {
        proxy_pass http://test;
        proxy_set_header Host $host:$server_port;
    }
}

*注:负载均衡的核心代码:

upstream test {
    server localhost:8080;
    server localhost:8081;
}

这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8080 具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。

  • 2.2、权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况,例如:

upstream test {
    server localhost:8080 weight=9;
    server localhost:8081 weight=1;
}

解释:那么如果有10次请求进来,一般只会有1次会访问到8081,而有9次会访问到8080

  • 2.3、ip_hash

上面的两种方式都有一个问题,就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream test {
    ip_hash;
    server localhost:8080;
    server localhost:8081;
}
  • 2.4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend { 
    fair; 
    server localhost:8080;
    server localhost:8081;
}
  • 2.5、url_hash(第三方)
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream backend { 
    hash $request_uri; 
    hash_method crc32; 
    server localhost:8080;
    server localhost:8081;
}

以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用。

3.HTTP服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器。

server {
    listen       80;                                                         
    server_name  localhost;                                               
    client_max_body_size 1024M;


    location / {
           root   e:www;
           index  index.html;
       }
}

这样如果访问http://localhost 就会默认访问到E盘www目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

  • 3.1.动静分离

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

    upstream test{  
       server localhost:8080;  
       server localhost:8081;  
    }   

    server {  
        listen       80;  
        server_name  localhost;  

        location / {  
            root   e:wwwroot;  
            index  index.html;  
        }  

        # 所有静态请求都由nginx处理,存放目录为html  
        location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {  
            root    e:www;  
        }  

        # 所有动态请求都转发给tomcat处理  
        location ~ .(jsp|do)$ {  
            proxy_pass  http://test;  
        }  

        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {  
            root   e:www;  
        }  
    }

 

这样就可以将HTML以及图片和css以及js放到www目录下,而tomcat只负责处理jsp和请求。例如:当我们后缀为gif的时候,Nginx默认会从www获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式,所以非常灵活

5.正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理,但是目前Nginx有一个问题,那么就是不支持HTTPS,虽然我百度到过配置HTTPS的正向代理,但是到最后发现还是代理不了,当然可能是我配置的不对,所以也希望有知道正确方法的同志们留言说明一下。

resolver 114.114.114.114 8.8.8.8;
server {

    resolver_timeout 5s;

    listen 81;

    access_log  e:wwwrootproxy.access.log;
    error_log   e:wwwrootproxy.error.log;

    location / {
        proxy_pass http://$host$request_uri;
    }
}

resolver是配置正向代理的DNS服务器,listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面使用服务器ip+端口号进行代理了。

6.最后

Nginx是支持热启动的,也就是说当我们修改配置文件后,不用关闭Nginx,就可以实现让配置生效,当然我一般也是使用restart命令重启;从读配置命令:

nginx -s reload

167891025
 
Copyright © 2008-2021 lanxinbase.com Rights Reserved. | 粤ICP备14086738号-3 |