Linux架构16 nginx rewrite伪静态实例, rewrite规则补充, HTTPS概述与配置
# 创建站点目录 [root@web01 ~]# mkdir /code/discuz [root@web01 code]# rz Discuz_X3.3_SC_GBK.zip [root@web01 code]# unzip Discuz_X3.3_SC_GBK.zip -d /code/discuz/ # 授权站点目录 [root@web01 discuz]# chown -R www.www /code/discuz/ # 配置discuz论坛的配置文件 [root@web01 conf.d]# cp wordpress.conf discuz.linux.com.conf [root@web01 conf.d]# vim discuz.linux.com.conf server { listen 80; server_name discuz.linux.com; location / { root /code/discuz/upload; index index.php; } location ~* \.php$ { root /code/discuz/upload; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } # 配置hosts访问
1.选全新安装Discuz! (含UCenter Server)
管理员账号admin 密码 admin
# 创建数据库 [root@db01 ~]# mysql -uroot -padmin123 MariaDB [(none)]> create database discuz charset utf8; MariaDB [(none)]> grant all on discuz.* to discuz@'172.16.1.%' identified by '123456';
3.点下一步,完成站点安装
# 查看帖子地址 http://discuz.linux.com/forum.php?mod=viewthread&tid=1&extra=page%3D1
点页面右上角管理中心,点击上方全局,点击左侧SEO设置
在URL静态化中,把可用全都打钩,Rewrite兼容性选是
点击提交,点击查看当前的 Rewrite规则 (其他项目也是开发给)
# 把Nginx Web Server中的规则写入nginx配置中 [root@web01 conf.d]# vim /etc/nginx/conf.d/discuz.linux.com.conf server { listen 80; server_name discuz.linux.com; location / { root /code/discuz/upload; index index.php; rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last; #[^]中括号加剪头表示取反,这里表示不以.开头 rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last; rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last; rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last; rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last; rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last; rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last; rewrite ^([^\.]*)/archiver/(fid|tid)-([0-9]+)\.html$ $1/archiver/index.php?action=$2&value=$3 last; rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $ 1/plugin.php?id=$2:$3 last; if (!-e $request_filename) { # -e判断文件或者目录是否存在 return 404; } } location ~* \.php$ { root /code/discuz/upload; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ------------------------------------------- # 重启nginx [root@web01 conf.d]# systemctl restart nginx # 访问帖子变为下方地址 http://discuz.linux.com/thread-1-1-1.html # ^([^\.]*) 不以点开头的所有内容(加中括号表示不以点开头),表示域名 rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last; # 通过跳转可以看出跳转的地址如下 http://discuz.linux.com/forum.php?mod=viewthread&tid=1&extra=page%3D1&page=1
1.先执行server模块的rewrite指令 2.其次执行location匹配规则 3.最后执行location里面的rewrite server { listen 80; server_name rw.linux.com; rewrite ^(.*)$ http://www.jingdong.com; location /test { rewrite ^(.*)$ http://www.mumusir.com; } location =/ { rewrite ^(.*)$ http://www.baidu.com; } } # 先走server的rewrite,如果没有走=/(级别高),如果没有再走/test
$server_name #当前用户请求的域名 server { listen 80; server_name rw.linux.com; root /code; rewrite ^(.*)$ http://$server_name; # $server_name就是rw.linux.com } $request_filename #请求的文件路径和名字(带着网站站点目录的路径和文件 /code/images/1.jpg) $request_uri # 请求的文件路径和名字(不带网站站点目录的路径和文件 /images/1.jpg) server { listen 80; server_name rw.linux.com; root /code; rewrite ^(.*)$ http://$server_name$request_uri; } # 很久很久以前,网站优化 server { listen 80; server_name www.baidu.com baidu.com; root /code; if ($http_host = baidu.com) { rewrite (.*) http://www.baidu.com; } } # 对上方改进的实际写法 server { listen 80; server_name baidu.com; rewrite (.*) http://www.baidu.com; } server { listen 80; server_name www.baidu.com; root /code; } # 现在直接在阿里云域名解析中设置标签@,如下图
# NGINX主配置文件,错误日志级别改成notice (跳转属于notice级别) [root@web01 ~]# vim /etc/nginx/nginx.conf error_log /var/log/nginx/error.log notice; # http层开启rewrite日志 rewrite_log on; # 重启nginx后可以通过 /var/log/nginx/error.log 查看
为什么需要使用HTTPS,因为HTTP不安全,当我们使用http网站时,会遭到劫持和篡改,如果采用https协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡改数据报文信息,同时也避免网站传输时信息泄露。
那么我们在实现https时,需要了解ssl协议,但我们现在使用的更多的是TLS加密协议。
那么TLS是怎么保证明文信息被加密的呢?在OSI七层模型中,应用层是http协议,那么在应用层协议之下,我们的表示层,是ssl协议所发挥作用的一层,他通过(握手、交换秘钥、告警、加密)等方式,是应用层http协议没有感知的情况下做到了数据的安全加密
我们首先需要申请证书,先去登记机构进行身份登记,我是谁,我是干嘛的,我想做什么,然后登记机构再通过CSR发给CA, CA中心通过后会生成一堆公钥和私钥,公钥会在CA证书链中保存,公钥和私钥证书我们拿到后,会将其部署在WEB服务器上 1.当浏览器访问我们的https站点时,他会去请求我们的证书 2.Nginx这样的web服务器会将我们的公钥证书发给浏览器 3.浏览器会去验证我们的证书是否合法有效 4.CA机构会将过期的证书放置在CRL服务器,CRL服务的验证效率是非常差的,所以CA又推出了OCSP响应程序,OCSP响应程序可以查询指定的一个证书是否过期,所以浏览器可以直接查询OSCP响应程序,但OSCP响应程序性能还不是很高 5.Nginx会有一个OCSP的开关,当我们开启后,Nginx会主动上OCSP上查询,这样大量的客户端直接从Nginx获取证书是否有效
# 配置一个我的网站 [root@web01 conf.d]# vim jc.linux.com.conf server { listen 80; server_name jc.linux.com; root /code/jc; index index.html; charset utf8; } # 配置一个我的页面 [root@web01 conf.d]# mkdir /code/jc [root@web01 conf.d]# vim /code/jc/index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>我是一个标签</title> </head> <body> <article> <header> <h1>我是linhaoda</h1> <p>创建时间:<time pubdate="pubdate">2020-03-04</time></p> </header> <p> <b>Aticle</b>很怕被别人劫持,好他*的紧张... </p> <footer> <p><small>最终解释权归我所有!</small></p> </footer> </article> </body> </html> # 访问测试配置hosts(报错可能是hosts文件中一行域名添加超过上限,换行再写就行了)
# lb01机器 [root@lb01 ~]# cd /etc/nginx/conf.d/ [root@lb01 conf.d]# vim jc.linux.com.conf server { listen 80; server_name jc.linux.com; location / { proxy_pass http://10.0.0.7; proxy_set_header HOST $http_host; sub_filter '我是一个标签' '我是一个正经网站'; sub_filter '很怕被别人劫持' '第一次劫持别人网站'; sub_filter '最终解释权归我所有' '彪悍的人生不需要解释'; } } # 切换hosts配置
1.保护一个域名 www.mumusir.com 2.保护多个域名 www. test. cdn. image. class. 3.保护通配符域名 *.mumusir.com
1.https不支持续费,证书到期需要重新申请并进行替换 2.https不支持上级域名解析,如 test.m.haoda.com 3.https显示绿色,说明整个网站的url都是https的 https显示黄色,因为网站代码中包含http的不安全链接 https显示红色,那么证书是假的或者证书过期。
[root@web01 conf.d]# nginx -V --with-http_ssl_module # 必须要有这个模块
[root@web01 conf.d]# mkdir /etc/nginx/ssl-key [root@web01 conf.d]# cd /etc/nginx/ssl-key/
[root@web01 ssl-key]# openssl genrsa -idea -out server.key 2048 #(生成key文件) Generating RSA private key, 2048 bit long modulus ...........+++ ...............................+++ e is 65537 (0x10001) Enter pass phrase for server.key: # 输入密码,这里输入 123456 Verifying - Enter pass phrase for server.key: # 再次输入密码验证 # 下方为申请的假证所需要验证人的身份信息 (生成crt文件) [root@web01 ssl-key]# openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt Generating a 2048 bit RSA private key .........+++ ................................+++ writing new private key to 'server.key' ----- 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]:zg # 输入国家 State or Province Name (full name) []:shanghai Locality Name (eg, city) [Default City]:pd Organization Name (eg, company) [Default Company Ltd]:oldboy Organizational Unit Name (eg, section) []:oldboy Common Name (eg, your name or your server's hostname) []:maliao Email Address []:123@qq.com # 命令参数说明 # req --> 用于创建新的证书 # new --> 表示创建的是新证书 # x509 --> 表示定义证书的格式为标准格式 # key --> 表示调用的私钥文件信息 # out --> 表示输出证书文件信息 # days --> 表示证书的有效期 [root@web01 ssl-key]# ll (这里是成对的) total 8 -rw-r--r-- 1 root root 1375 Oct 9 23:45 server.crt -rw-r--r-- 1 root root 1708 Oct 9 23:45 server.key
# 启动ssl功能 Syntax: ssl on | off; Default: ssl off; # 默认是关闭的 Context: http, server # 证书文件(crt文件) Syntax: ssl_certificate file; Default: — Context: http, server #当前虚拟主机的证书文件,通常是PEM格式,该文件中有两部份,分别是虚拟主机的证书和CA机构的证书
# 私钥文件(key文件) Syntax: ssl_certificate_key file; Default: — Context: http, server
ssl_session_cache off|none|[builtin[:size]] [shared:name:size]; #配置SSL缓存,作用域 http, server #off 禁用SSL/TLS会话缓存 #none 通知客户端可以重用会话,但并没有缓存相关数据,默认值 #builtin[:size] 使用OpenSSL内建缓存,可指定大小,每个worker 进程独享 #[shared:name:size] 使用共享缓存,每个worker进程共享该缓存中的数据,可指定name和大小 ssl_session_timeout time; #配置SSL/TLS会话缓存的超时时间,默认值 5m,作用域 http,server
#使用SSL/TLS会话缓存有助于减少服务器的加密和解密负担,提高HTTPS连接的响应速度,启用缓存需要 ssl_session_cache,ssl_session_timeout 两个选项一起使用 #SSL/TLS会话缓存存储的是SSL/TLS握手过程中生成的会话数据。在SSL/TLS握手过程中,服务器和客户端 会交换一系列数据,其中包括协商的密钥、加密算法、会话标识符等信息。这些信息用于确保安全通信,并在 建立连接后用于加密和解密通信的数据
#SSL/TLS会话缓存中存储的主要数据包括 会话标识符(Session Identifier),主密钥(Master Secret),加密算法和参数
#通过存储这些会话数据,SSL/TLS会话缓存允许服务器在处理新连接时,如果客户端提供了先前使用过的会 话标识符,就可以重用这些数据,避免重新执行完整的SSL/TLS握手。这样可以大幅度减少握手过程中的计算 和通信开销,提高性能和响应速度。同时,它还有助于减少服务器的负担,因为不需要重新生成新的密钥和协 商参数
[root@web01 ssl-key]# vim /etc/nginx/conf.d/s.linux.com.conf server { #listen 443; # https是443端口 listen 443 ssl; # 新版本采用这种,等于listen 443和ssl on(老版本,会警告但无影响) server_name s.linux.com; #ssl on; # 开启ssl ssl_certificate /etc/nginx/ssl-key/server.crt;#如果是相对路径,会从/etc/nginx找,但不推荐 ssl_certificate_key /etc/nginx/ssl-key/server.key; location / { root /code/https; index index.html; } }
server { # 写这一块,输入地址的时候就不用前面特意加上https了,会自动跳转
listen 80;
server_name s.linux.com;
#rewrite (.*) https://$server_name$1 redirect;
return 302 https://$server_name$request_uri; # 等效于rewrite
} # 重启nginx [root@web01 ssl-key]# systemctl restart nginx # 配置站点 [root@web01 ssl-key]# mkdir /code/https [root@web01 ssl-key]# echo "test https" > /code/https/index.html
https://s.linux.com/
浏览器会提示不安全,点击证书查看
nginx配置https示例
#从阿里云申请下载ssl证书 #配置https server{ listen 80; server_name www.m99-magedu.com; root /var/www/html/www.m99-magedu.com; } server{ listen 443 ssl; server_name www.m99-magedu.com; root /var/www/html/www.m99-magedu.com; ssl_certificate /usr/share/easy-rsa/pki/www.m99-magedu.com.pem; ssl_certificate_key /usr/share/easy-rsa/pki/private/www.m99-magedu.com.key; ssl_session_cache shared:sslcache:20m; ssl_session_timeout 10m; } #配置http 强制跳转 https server{ listen 80; server_name www.m99-magedu.com; return 301 https://$host$request_uri; #301重定向 rewrite ^(.*) https://$server_name$1 permanent; #rewrite 重定向,二选一 } #在浏览器中测试 http://www.m99-magedu.com/index.html?abc=123&def=456
#http 和 https 写在同一个配置中 server{ listen 80; listen 443 ssl; server_name www.m99-magedu.com; root /var/www/html/www.m99-magedu.com; ssl_certificate /usr/share/easy-rsa/pki/www.m99-magedu.com.pem; ssl_certificate_key /usr/share/easy-rsa/pki/private/www.m99-magedu.com.key; ssl_session_cache shared:sslcache:20m; ssl_session_timeout 10m; }
#同一个配置中自动跳转 server{ listen 80; listen 443 ssl; server_name www.m99-magedu.com; root /var/www/html/www.m99-magedu.com;
ssl_certificate /usr/share/easy-rsa/pki/www.m99-magedu.com.pem; ssl_certificate_key /usr/share/easy-rsa/pki/private/www.m99- magedu.com.key; ssl_session_cache shared:sslcache:20m; ssl_session_timeout 10m;
if ($scheme = http){ return 301 https://$host$request_uri; rewrite ^(.*) https://$server_name$1 permanent; #二选一 } }