Nginx简介
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也是一个IMAP/POP3/SMTP代理服务器。
是俄罗斯人编写的十分轻量级的HTTP服务器
官方网站: 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服务
第四步
客户端进行测试
nginx命令的用法:
[root@proxy ~]# /usr/local/nginx/sbin/nginx #启动服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s stop #关闭服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload #重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -V #查看软件信息
[root@proxy ~]# /usr/local/nginx/sbin/nginx -c #指定配置文件,启动服务
List item
netstat命令可以查看系统中启动的端口信息,跟ss的用法一致,该命令常用选项如下:
-a显示所有端口的信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
[root@proxy ~]# yum -y install gcc openssl-devel pcre-devel ##下载依赖包
[root@proxy opt]# tar xf nginx-1.12.2.tar.gz ##解包 [root@proxy ~]# cd
nginx-1.12.2 [root@proxy nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \ #指定安装路径
--user=nginx \ #指定用户
--group=nginx \ #指定组
--with-http_ssl_module #开启SSL加密功能
[root@proxy nginx-1.12.2]# make && make install ##编译并安装
[root@proxy ~]# useradd -s /sbin/nologin nginx ##创建用户.shell环境为不可登录
[root@proxy ~]# /usr/local/nginx/sbin/nginx ##开启nginx服务 [root@proxy
~]# netstat -anptu | grep nginx (查看端口信息) tcp 0 0
0.0.0.0:80 0.0.0.0:* LISTEN 7383/nginx: master [root@client ~]# curl -I 192.168.4.5 ##进行页面测试
HTTP/1.1 200 OK (代表页面访问正常)
Server: nginx/1.12.2
Date: Tue, 31 Dec 2019 09:21:51 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 31 Dec 2019 09:00:58 GMT
Connection: keep-alive
ETag: "5e0b0e4a-264"
Accept-Ranges: bytes
[root@client ~]# firefox 192.168.4.5
写一个脚本自动安装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.客户端访问测试
以下的步骤是基于上面的基础
[root@proxy ~]# yum -y install httpd
[root@proxy ~]# htpasswd -c /usr/local/nginx/pass tom ##创建tom用户 追加用户不用-c选项
New password:
Re-type new password:
Adding password for user tom
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
38 auth_basic "Input Password:";
39 auth_basic_user_file "/usr/local/nginx/pass";
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
[root@client ~]# firefox 192.168.4.5 ##输入用户名及密码后即可访问
三种模式的虚拟主机
问题:
实现两个基于域名的虚拟主机,域名分别为www.a.com和www.b.com
对域名为www.a.com的站点进行用户认证,用户名称为tom,密码为123456
方案:
1.修改Nginx服务配置,添加相关虚拟主机配置
2.创建网站根目录及对应首页文件
3.重新加载配置
4.客户端测试
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
35 server {
36 listen 80;
37 server_name www.a.com; ##(实验需修改)
38 auth_basic "Input Password:";
39 auth_basic_user_file "/usr/local/nginx/pass";
85 server {
86 listen 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 ~]# mkdir /usr/local/nginx/www ##创建网页目录
[root@proxy ~]# echo "AAA" > /usr/local/nginx/html/index.html
[root@proxy ~]# echo "BBB" > /usr/local/nginx/www/index.html
[root@client ~]# vim /etc/hosts ##修改域名解析文件
192.168.4.5 www.a.com www.b.com
[root@proxy ~]# vim /etc/hosts
192.168.4.5 www.a.com www.b.com
[root@proxy ~]# firefox www.a.com ##输入密码后页面出现AAA
[root@proxy ~]# firefox www.b.com ##页面出现BBB
[root@client ~]# firefox www.a.com ##输入密码后页面出现AAA
[root@client ~]# firefox www.b.com ##页面出现BBB
注意事项:
nginx网页内容默认不支持中文,所以打中文会出现乱码,修改配置文件
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
40 charset utf-8; (修改成utf-8)
89 charset utf-8;
[root@proxy ~]# echo "你好帅" > /usr/local/nginx/html/index.html
[root@proxy ~]# echo "你最帅" > /usr/local/nginx/www/index.html
[root@client ~]# yum -y install google-noto-sans-simplified-chinese-fonts.noarch
[root@client ~]# curl www.a.com
你好帅
[root@client ~]# curl 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地址分别为192.168.4.207和192.168.2.208
对IP为192.168.4.207的站点进行用户认证,用户名称为tom,密码为123456
方案:
1.修改Nginx服务配置,添加相关虚拟主机配置
3.重新加载配置
4.客户端测试
```cpp
[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加密网站
```bash
- 源码安装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 ##生成私钥
[root@proxy ~]# openssl req -new -x509 -key cert.key > cert.pem ##生成证书(公钥)
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
108 server {
109 listen 443 ssl;
110 server_name www.c.com; (实验需修改)
111 ssl_certificate cert.pem; #这里是证书文件
112 ssl_certificate_key cert.key; #这里是私钥文件
113
114 ssl_session_cache shared:SSL:1m;
115 ssl_session_timeout 5m;
116
117 ssl_ciphers HIGH:!aNULL:!MD5;
118 ssl_prefer_server_ciphers on;
120
121 location / {
122 root html;
123 index index.html index.htm;
124 }
125 }
126
127 }
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
[root@client ~]# vim /etc/hosts
192.168.4.5 www.c.com www.a.com www.b.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 ##恢复校验值