一、搭建基于ssl技术的安全网站
nginx的依赖包
- gcc make
- pcre-devel
- openssl-devel
- conf(主配置文件)
- html(网页文件)
- sbin(开服务)
- logs(日志)
sbin/nginx -s reload (重新读取配置文件)
sbin/nginx -V 模块
了解加密算法
- 对称算法 AES DES 单机数据加密 一个密码可以加密,同时也可以解密
- 非对称算法 RSA DSA 网络数据加密 私钥 解密(钥匙) 公钥 加密(锁)
- 信息摘要 md5 sha256 数据校验
环境准备,如果nginx异常,需要按照以下方式重新创建
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s stop #首先关闭nginx
[root@proxy ~]# cd ~/lnmp_soft/nginx-1.17.6/ #重新到nginx目录
[root@proxy ~]# rm -rf /usr/local/nginx/ #删除现有nginx
[root@proxy ~]# make install #重新安装nginx
[root@proxy ~]# cd /usr/local/nginx/ #回到nginx目录
[root@proxy ~]# sbin/nginx -V #查询可以看到下列信息中有" --with-http_ssl_module "模块即可
configure arguments: --prefix=/usr/local/nginx --user=nginx --with-http_ssl_module
修改配置,实现安全加密网站
加密网站的端口:443 非加密的网站:80
[root@proxy ~]# cd /usr/local/nginx/
[root@proxy nginx]# vim conf/nginx.conf #修改98~115行
将98到115行的#替换为空
:98,115s/#//
server {
listen 443 ssl; #监听接口
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_c; #这里修改页面存储目录
index index.html index.htm;
}
}
创建私钥与证书
[root@proxy ~]# cd /usr/local/nginx/
[root@proxy nginx]# openssl genrsa > conf/cert.key #创建私钥,创建在主配置文件目录下
[root@proxy nginx]# openssl req -x509 -key conf/cert.key > conf/cert.pem #创建证书,生成过程会有问题,使用-x509格式 根据私钥创建公钥 重定向 创建在主配置文件目录下
Country Name (2 letter code) [XX]:dc #国家名
State or Province Name (full name) []:dc #省份
Locality Name (eg, city) [Default City]:dc #城市
Organization Name (eg, company) [Default Company Ltd]:dc #公司
Organizational Unit Name (eg, section) []:dc #部门
Common Name (eg, your name or your server's hostname) []:dc #服务器名称
Email Address []:dc@dc.com #电子邮件
创建页面并测试
[root@proxy ~]# cd /usr/local/nginx/
[root@proxy nginx]# mkdir html_c #创建安全网站的目录
[root@proxy nginx]# echo "nginx-C~~~~" > html_c/index.html #创建安全网站的页面
[root@proxy nginx]# sbin/nginx #开服务
[root@proxy nginx]# sbin/nginx -s reload #重加载配置
[root@proxy nginx]# curl -k https://www.c.com #检验,-k是忽略风险
nginx-C ~~~~ #看到这个内容就说明实验成功
[root@proxy nginx]# systemctl stop firewalld #如果用真机的火狐浏览器测试需要关闭防火墙,然后输入https://www.c.com 火狐浏览器测试仅限于真机是windows,
二、部署LNMP 环境,实现动态网站解析
静态网站 在不同环境下 访问网站内容不会变化
动态网站 在不同环境下 访问网站内容有可能变化
有了LNMP环境,nginx就可以很便利的支持动态网站,这也是主流的企业网站平台之一
LNMP环境
- L linux #系统
- N nginx #网络服务
- M mariadb (mysql) #数据库
- P php #开发语言
准备nginx以及相关软件包
[root@proxy ~]# cd ~/lnmp_soft/nginx-1.17.6/
killall nginx #关掉nginx相关程序
rm -rf /usr/local/nginx/ #删除nginx原有目录
./configure --with-http_ssl_module #配置
make #编译
make install #安装
安装mariadb
yum -y install mariadb-server #安装数据库服务端
yum -y install mariadb #安装数据库客户端
yum -y install mariadb-devel #安装数据库依赖包
yum -y install php #安装php环境(相当于解释器)
yum -y install php-mysql #安装php与数据库关联的软件包
yum -y install php-fpm #安装可以让nginx具备动态网站解析能力的软件包(服务)
systemctl start mariadb #开启数据库
systemctl start php-fpm #开启php-fpm
netstat -ntulp | grep :3306 #检测数据库服务
netstat -ntulp | grep :9000 #检测php-fpm服务
修改nginx配置(打开动态网站的服务)
打开nginx配置文件,第65到71行去掉注释,69行不用去
[root@proxy nginx]# vim conf/nginx.conf
65 location ~ \.php$ { #~是使用正则表达式,匹配以.php结尾当用户访问动态网站时交给后台php(67行)
66 root html; #网站页面位置,不用改,保持默认
67 fastcgi_pass 127.0.0.1:9000; #一旦用户访问了.php结尾的文件,就让nginx找后台的php-fpm(端口号9000)
68 fastcgi_index index.php; #动态网站的默认页面,无需修改
69 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
70 include fastcgi.conf; #这里需要修改名称
71 }
测试效果
cd ~/lnmp_soft/php_scripts/
[root@proxy php_scripts]# cp test.php /usr/local/nginx/html/ #拷贝动态网站测试页面到nginx中
[root@proxy php_scripts]# systemctl stop firewalld #关闭防火墙
[root@proxy php_scripts]# /usr/local/nginx/sbin/nginx #开启nginx,如果已经开启就使用 /usr/local/nginx/sbin/nginx -s reload 如果均不能正常开启,就用killall nginx然后重新试
然后使用浏览器访问192.168.2.5/test.php 可以看到以下内容说明nginx成功支持动态网站。
This is HTML message
c is bigger
测试有数据库的动态网站
cd ~/lnmp_soft/php_scripts/ #到php目录
cp mysql.php /usr/local/nginx/html/ #拷贝另外一个测试页面到nginx
#浏览器打开http://192.168.2.5/mysql.php 可以看到网站显示了数据的账户信息
mysql #进入数据库
create user dc@localhost identified by '123'; #创建测试账户
quit #退出(q)
#刷新http://192.168.2.5/mysql.php 可以看到新创建的用户
fastCGI
三、地址重写,可以精简访问路径,也可以隐藏服务器真实文件路径
格式:rewrite 旧(支持正则) 新 选项
[root@proxy nginx]# echo 'AAA~~~~~' >html/a.html
[root@proxy nginx]# echo 'BBB~~~~~' >html/b.html
[root@proxy nginx]# cat html/a.html
AAA~~~~~
[root@proxy nginx]# cat html/b.html
BBB~~~~~
地址重写测试1:
[root@proxy nginx]# vim conf/nginx.conf
42 rewrite /a.html /b.html; #地址跳转,输入192.168.2.5/a.html 会看到/b.html
[root@proxy nginx]# vim conf/nginx.conf
rewrite ^/a.html$ /b.html redirect;
然后打开火狐使用http://192.168.2.5/a.html路径访问网站可以看到b页面
如果访问http://192.168.2.5/a.htmldc 或者http://192.168.2.5/dc/a.html
可能造成误跳转,所以在rewrite 后匹配旧路径时要增加^ 和$
地址重写测试2:
42 rewrite ^/a.html$ /b.html redirect; #在刚刚的配置中添加redirect
[root@proxy nginx]# sbin/nginx -s reload
使用http://192.168.2.5/a.html路径访问网站
地址重写测试3:从旧网站跳到新网站
42 rewrite / http://www.tmooc.cn; #访问192.168.2.5就跳到tmooc
[root@proxy nginx]# sbin/nginx -s reload
使用火狐浏览器访问192.168.2.5 会跳到tmooc.cn
地址重写测试4: 不同网站的相同页面的跳转
42 rewrite /(.*) http://www.tmooc.cn/$1; #访问老网站的某个页面时,跳转到
新网站对应的相同页面。前面使用正则表达式匹配用户输入的任意页面,并保存
起来(小括号在正则中的效果是保留,相当于复制),后面使用$1将之前保存的页面地址粘贴到新网站
[root@proxy nginx]# sbin/nginx -s reload #重加载配置文件
使用火狐浏览器访问192.168.2.5/a.html可以转到www.tmooc.cn/a.html (由于该网
站没有a.html页面,会出现404报错属于正常)
地址重写测试5:为火狐浏览器用户设置专属页面
火狐浏览器 192.168.2.5/abc.html 火狐专属页面 html/firefox/abc.html
非火狐浏览器 192.168.2.5/abc.html 普通页面 html/abc.html
修改配置文件,删除原有地址重写,在第47行添加
[root@proxy nginx]# vim conf/nginx.conf
if ($http_user_agent ~* firefox){ #如果用户使用了火狐浏览器
rewrite /(.*) /firefox/$1; #就进行地址重写操作,让用户看到火狐专属页面
#$http_user_agent是nginx的内置变量,存储了用户的信息,比如用的什么浏览器~匹配正则 *忽略大小写
[root@proxy nginx]# mkdir html/firefox #创建火狐页面专属目录
[root@proxy nginx]# echo "firefox~~~" > html/firefox/abc.html #创建火狐专属页面
[root@proxy nginx]# echo "others~~~~" > html/abc.html #创建普通页面
[root@proxy nginx]# sbin/nginx -s reload
关闭防火墙,然后使用火狐浏览器查看192.168.2.5/abc.html可以看到之前html/firefox目录下的页面,非火狐浏览器看到的是html下的页面