Nginx简介
Nginx(“engine x”)
- 是俄罗斯人编写的十分轻量级的HTTP服务器
- 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器
- 官方网站: http://nginx.org
nginx的特点
- 占用内存少,在处理静态文件时,比Apache占用更少的内存及资源
- 并发能力强 , 支持高达50000个并发连接
- 性能稳定、几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
- Nginx配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。
- 模块化程度高:Nginx是高度模块化的设计,编写模块相对简单 成本低 : Nginx可以做高并发的负载均衡,且Nginx是开源免费的
- nginx是由c语言编写,支持多个系统
nginx的缺点
- 动态网页处理比较差,不适合做动态网页
Web服务器对比
Unix和Linux平台下
- Apache Nginx tengine Lighttpd
- Tomcat IBM Websphere Jboss
Windows平台下
- 微软公司的IIS(Internet Informatica Server)
Nginx的安装
下面将用两台虚拟机做实验,其中一台作为nginx服务器(192.168.4.5)
另外一台作为测试用的客户机(192.168.4.10)
已将下载好的源码包传到nginx服务器上,版本为: nginx-1.12.2
需求:*
① 部署nginx软件,支持HTTPS加密
② 客户端访问nginx服务器
方案:
第一步: 安装依赖包gcc. openssl-devel. pcre-devel 依赖包的作用: gcc 编译工具 openssl-devel 支持正则表达式 pcre-devel 支持安全加密
第二步: 编译模块并安装
第三步 创建nginx用户,开启nginx服务
第四步 客户端进行测试
1.在真机上切换到Linux-soft目录,远程源码包到虚拟机Client以及proxy上
[student@room9pc01 ~]$ cd /linux-soft/02
[student@room9pc01 02]$ ls
ceph10.iso exam exam.tar.gz grade grade.tar.gz lnmp_soft.tar.gz
[student@room9pc01 02]$ scp lnmp_soft.tar.gz root@192.168.4.10:/root
lnmp_soft.tar.gz 100% 155MB 49.9MB/s 00:03
[student@room9pc01 02]$ scp lnmp_soft.tar.gz root@192.168.4.5:/root
lnmp_soft.tar.gz 100% 155MB 154.6MB/s 00:01
2.在虚拟机上解包,proxy做web服务器
[root@proxy ~]# ls
Desktop lnmp_soft.tar.gz
[root@proxy ~]# tar -xf lnmp_soft.tar.gz
[root@proxy ~]# ls
Desktop lnmp_soft lnmp_soft.tar.gz
[root@proxy ~]# cd lnmp_soft
[root@proxy lnmp_soft]# ls nginx*
nginx-1.10.3.tar.gz nginx-1.12.2.tar.gz nginx-1.15.8.tar.gz nginx.conf.bak nginx.spec
3.安装nginx的依赖包
[root@proxy ~]# yum -y install gcc openssl-devel pcre-devel #下载依赖包
[root@proxy ~]# useradd -s /sbin/nologin nginx #安装普通用户nginx,以普通用户nginx身份启动nginx软件
[root@proxy nginx-1.12.2]# ./configure\ #指定安装路径,默认安装在/usr/local/nginx目录下
> --user=nginx \ #指定用户
> --group=nginx \ #指定组
> --with-http_ssl_module #开启ssl加密功能
[root@proxy nginx-1.12.2]# make && make install #安装
[root@proxy nginx-1.12.2]# ls /usr/local/nginx/ #查看nginx的默认路径
conf html logs sbin
[root@proxy nginx-1.12.2]# /usr/local/nginx/sbin/nginx #开启nginx服务
4.访问页面
nginx命令的用法(不能重复开启或关闭服务!)
[root@proxy nginx-1.12.2]# /usr/local/nginx/sbin/nginx #启动服务
[root@proxy nginx-1.12.2]# /usr/local/nginx/sbin/nginx -s stop #关闭服务
[root@proxy nginx-1.12.2]# /usr/local/nginx/sbin/nginx -s reload #重新加载配置文件 (不关闭服务的情况下重新加载配置文件,只能在服务开启的状态下使用)
[root@proxy nginx-1.12.2]# /usr/local/nginx/sbin/nginx -V #查看软件信息
[root@proxy nginx-1.12.2]# /usr/local/nginx/sbin/nginx -c #指定配置文件,启动服务
netstat 命令
-a显示所有端口的信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
5.查看当前端口
[root@proxy nginx-1.12.2]# netstat -anutlp | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 28316/nginx: master
写一个脚本自动安装nginx软件,以及控制nginx软件的小工具.仅适用学习环境
[root@localhost opt]# vim nginx.sh ##安装nginx软件
#!/bin/bash
#这是一个基于ip已配好,yum仓库正常运行的情况下,自动安装nginx并启动服务的脚本,此脚本仅供参考
rpm -q expect &> /dev/null
if [ $? -eq 0 ];then
a=`awk -F/ 'NR==3{print $3}' /etc/yum.repos.d/local.repo`
expect << EOF
set timeout 2
spawn scp -r student@$a:/linux-soft/02/lnmp_soft.tar.gz /opt
expect "(yes/no)" { send "yes\r" }
expect "password:" { send "student\r" }
expect "#" { send "exit\r" }
EOF
yum -y install gcc openssl-devel pcre-devel &> /dev/null
tar -xf /opt/lnmp_soft.tar.gz -C /opt
tar -xf /opt/lnmp_soft/nginx-1.12.2.tar.gz -C /opt
cd /opt/nginx-1.12.2
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module &> /dev/null
make && make install &> /dev/null
useradd -s /sbin/nologin nginx
#systemctl stop firewalld ##安装有防火墙就需要这一步
/usr/local/nginx/sbin/nginx
else
echo "启动此脚本需要下载expect软件" && exit
fi
[root@localhost opt]# chmod +x nginx.sh
[root@localhost opt]# vim nginx ##控制nginx软件
#!/bin/bash
#这是一个简单的控制nginx服务脚本,此脚本仅供参考
case $1 in
start|s)
netstat -ntulp | grep -q nginx
[ $? -eq 0 ] && echo -e "\033[31m nginx已经开启了\033[0m" && exit
/usr/local/nginx/sbin/nginx;;
stop|p)
netstat -ntulp | grep -q nginx
[ $? -ne 0 ] && echo -e "\033[32m nginx已经关闭了\033[0m" && exit
/usr/local/nginx/sbin/nginx -s stop;;
restart|res)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx;;
reload|r)
/usr/local/nginx/sbin/nginx -s reload;;
V|v)
/usr/local/nginx/sbin/nginx -V;;
vim)
vim /usr/local/nginx/conf/nginx.conf;;
net|n)
netstat -ntulp | grep -q nginx
[ $? -eq 0 ] && echo -e "\033[33m nginx服务已开启\033[0m" || echo -e "\033[34m nginx服务未开启\033[0m";;
*)
echo "请输入s|p|res|n|r|v|vim"
esac
[root@localhost opt]# chmod +x nginx
[root@localhost opt]# echo "alias nginx='/opt/nginx.sh'" >> ~/.bashrc
nginx配置解析
nginx配置文件结构
- /usr/local/nginx/conf/nginx.conf --> nginx的主配置文件
- /usr/local/nginx/html -->网页目录
- /usr/local/nginx/logs —>日志文件
- /usr/local/nginx/sbin ----->主程序文件
用户认证
需求:
访问Web页面需要进行用户认证
用户名为:tom,密码为:123456
如图:
方案:
1.安装httpd-tools(httpd默认包含)
2.创建用户和密码
3.书写配置文件
4.重置服务配置文件
5.客户端访问测试
1.修改nginx默认配置文件
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80; #端口
server_name localhost; #域名
auth_basic "Input password"; #认证提示符信息(引号内内容随便写),分号不要忘记!!
auth_basic_user_file "/usr/local/nginx/pass"; #认证的密码文件(引号内容随便写)
location / {
root html; #网页默认存放路径(相对路径)
index index.html index.htm; #默认首页
2.安装软件包httpd-tools
[root@proxy ~]# yum -y install httpd-tools
3.创建一个网站的密码文件,必须要和主配置文件中的密码文件名称一样!
[root@proxy ~]# htpasswd -c /usr/local/nginx/pass tom #-c 创建用户,如果想要追加用户,取消-c选项
New password: #创建密码
Re-type new password: #确认密码
Adding password for user tom
[root@proxy ~]# cat /usr/local/nginx/pass #查看是否创建成功
aaa:$apr1$/9hHDZlP$iEVxjJUJ.BbayeztwJn/B/
4.重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
5.测试访问,此时进入页面需要用户密码
三种模式的虚拟主机
基于域名的虚拟主机
一个软件包可以做多个虚拟网站,叫做虚拟主机
实现两个基于域名的虚拟主机,分别叫www.a.com和www.b.com
对域名为www.a.com的站点进行用户认证,用户名称为tom,密码为123456
方案:
修改Nginx配置文件,添加server容器实现虚拟主机功能;
对于需要进行用户认证的虚拟主机添加auth认证语句。
虚拟主机一般可用分为:基于域名、基于IP和基于端口的虚拟主机。
1.修改配置文件,添加相关虚拟主机配置
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server { #第一个虚拟主机
listen 80;
server_name www.a.com;
auth_basic "Input password";
auth_basic_user_file "/usr/local/nginx/pass";
location / { #指定网站根路径
root html;
index index.html index.htm;
}
}
server { #第二个虚拟主机
listen 80;
server_name www.b.com;
charset utf-8; #支持中文
location / {
root www;
index index.html index.htm;
}
}
2.创建网页根目录及首页文件
[root@proxy ~]# mkdir /usr/local/nginx/www
[root@proxy ~]# echo "wo shi wang ye " > /usr/local/nginx/www/index.html
3.重起网页
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
#请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
#[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
4.用192.168.4.10作为客户端访问网页
注意:请先关闭真实机的firefox,再SSH -X远程连接调用虚拟机的firefox。
[root@client ~]# vim /etc/hosts
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.4.5 www.a.com www.b.com #添加虚拟主机的域名
[root@client ~]# exit
登出
Connection to 192.168.4.10 closed.
[student@room9pc01 ~]$ ssh -X root@192.168.4.10 #一定要加-X选项
[root@client ~]# firefox www.a.com #输入用户名密码登录
[root@client ~]# firefox www.b.com
要想客户机支持中文,下载软件包,服务端输入charset utf-8
[root@client ~]# yum list | grep chinese | grep google
google-noto-sans-simplified-chinese-fonts.noarch #简体中文包
google-noto-sans-traditional-chinese-fonts.noarch #繁体中文包
[root@client ~]# yum -y install google-noto-sans-simplified-chinese-fonts.noarch
解析出www.a.com出现以下页面
解析出www.b.com出现以下页面
基于端口的虚拟主机
问题:
实现两个基于端口的虚拟主机,端口号分别为8080和8000
对域名为www.a.com的站点进行用户认证,用户名称为tom,密码为123456
方案:
1.修改Nginx服务配置,添加相关虚拟主机配置
3.重新加载配置
4.客户端测试
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
35 server {
36 listen 8080;(实验需修改)
37 server_name www.a.com;
38 auth_basic "Input Password:";
39 auth_basic_user_file "/usr/local/nginx/pass";
85 server {
86 listen 8000; (实验需修改)
87 server_name www.b.com;
88
89 location / {
90 root www;
91 index index.html index.htm;
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
[root@proxy ~]# firefox www.a.com:8080 ##输入密码后页面出现AAA
[root@proxy ~]# firefox www.b.com:8000 ##页面出现BBB
基于IP的虚拟主机
问题:
实现两个基于IP的虚拟主机,IP地址分别为192.168.4.207和192.168.2.208
对IP为192.168.4.207的站点进行用户认证,用户名称为tom,密码为123456
方案:
1.修改Nginx服务配置,添加相关虚拟主机配置
3.重新加载配置
4.客户端测试
[ro[root@proxy ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.4.207 netmask 255.255.255.0 broadcast 192.168.4.255
ot@proxy2 ~]# setip
Network name(eth0/eth1/eth2/eth3):eth1
Set IP(IP/24):192.168.2.208/24
Set Gateway(default none):0.0.0.0
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
35 server {
36 listen 192.168.4.5:80;(实验需修改)
37 #server_name www.a.com;
38 auth_basic "Input Password:";
39 auth_basic_user_file "/usr/local/nginx/pass";
40 location / {
41 root html;
42 index index.html index.htm;
85 server {
86 listen 192.168.2.6:80; (实验需修改)
87 #server_name www.b.com;
88
89 location / {
90 root www;
91 index index.html index.htm;
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
[root@proxy ~]# firefox 192.168.4.5 ##输入密码后页面出现AAA
[root@proxy ~]# firefox 192.168.2.6 ##页面出现BBB
[root@proxy nginx]# curl 192.168.4.5
AAA
[root@proxy nginx]# curl 192.168.2.6
BBB
HTTPS加密网站
- 源码安装Nginx时必须使用–with-http_ssl_module参数,启用加密模块,对于需要进行SSL加
- 密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)。
- 加密算法一般分为对称算法、非对称算法、信息摘要。
- 对称算法有:AES、DES,主要应用在单机数据加密。(对称秘钥,应用:RAR,ZIP单机加密)
- 非对称算法有:RSA、DSA,主要应用在网络数据加密。(非对称秘钥, 应用:HTTPS,SSH)
- 信息摘要:MD5、sha256,SHA512主要应用在数据完整性校验。(hash值,应用文件校验值)
问题
域名为www.c.com
该站点通过https访问
通过私钥、证书对该站点所有数据加密
方案
1)生成私钥与证书
2)修改Nginx配置文件,设置加密网站的虚拟主机
3)重新加载配置
4 ) 客户端验证
[root@proxy ~]# cd /usr/local/nginx/conf/
[root@proxy conf]# openssl genrsa > cert.key #生成私钥
Generating RSA private key, 2048 bit long modulus
................+++
.............+++
e is 65537 (0x10001)
[root@proxy conf]# openssl req -new -x509 -key cert.key > cert.pem #生成公钥
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn #国家
State or Province Name (full name) []:beijing #城市
Locality Name (eg, city) [Default City]:shenzhen #城市
Organization Name (eg, company) [Default Company Ltd]:lalalal #公司名
Organizational Unit Name (eg, section) []:bababba #组织单位名
Common Name (eg, your name or your server's hostname) []:hahah #名字
Email Address []:aa@aa.com #邮件地址
[root@proxy conf]# ls cert.key
cert.key
[root@proxy conf]# ls cert.pem
cert.pem
2.修改配置文件
[root@proxy conf]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 443 ssl; #加密端口默认443
server_name www.c.com; #修改域名
ssl_certificate cert.pem; #公钥
ssl_certificate_key cert.key; #私钥
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html; #网页根目录
index index.html index.htm;
}
}
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3.在客户端访问网页
[root@client ~]# vim /etc/hosts #添加www.c.com
192.168.4.5 www.a.com www.b.com www.c.com
[root@client ~]# firefox https://www.c.com
客户端出现以下页面:
hash值用法
[root@proxy conf]# touch a.txt
[root@proxy conf]# echo ABC > a.txt
[root@proxy conf]# md5sum a.txt
0bee89b07a248e27c83fc3d5951213c1 a.txt
[root@proxy conf]# echo . >> a.txt
[root@proxy conf]# cat a.txt
abc
.
[root@proxy conf]# md5sum a.txt
fd8514d54a41010d6e512a9b083256ba a.txt ##hash值发生变化
[root@proxy conf]# sed -i '2d' a.txt ##删掉.
[root@proxy conf]# cat a.txt
abc
[root@proxy conf]# md5sum a.txt
0bee89b07a248e27c83fc3d5951213c1 a.txt ##恢复校验值