作者:matrix
发布时间:2024-06-20
分类:Linux PHP Wordpress
项目地址:https://github.com/FiloSottile/mkcert
本地开发环境有时候需要模拟真实的HTTPS环境,那就必须得配置SSL证书了。自签SSL证书就可以搞定,这回尝试用mkcert工具生成和配置自签SSL证书。
安装mkcert
本地是 mac 环境,直接用brew安装
brew install mkcert
信任自签根证书
安装并让系统信任mkcert的自签根证书。
mkcert -install
创建证书
mkcert "*.security.local" localhost 127.0.0.1 ::1
security.local就是我本地开发环境运行的域名
127.0.0.1 ::1 是对应的本地 IPV4 IPV6
创建的证书和私钥文件会保存在当前目录中
配置Nginx
正常配置nginx文件(e.g. /etc/nginx/nginx.conf)
添加内容:
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /path/to/localhost.pem;
ssl_certificate_key /path/to/localhost-key.pem;
# ...其余配置保持不变
}
# 可以选择添加一个额外的服务器块来处理 HTTP 到 HTTPS 的重定向
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}
说明:
/path/to/localhost.pem
/path/to/localhost-key.pem
这俩路径是证书和密钥文件位置
之后重启或者 reload nginx就可以了。 完美~~
作者:matrix
发布时间:2017-12-09
分类:零零星星
之前有使用脚本删除缓存的记录,但是没有留下下proxy的使用,今天正好配置下下。
>> nginx定向清理Proxy Cache缓存
proxy是nginx的自带模块,作为前台代理后端的数据库请求,负载均衡啊什么的贼6
proxy配置
修改 nginx.conf文件配置 lnmp环境一般都是/usr/local/nginx/conf/nginx.conf
在http
代码块中添加proxy操作
> vi /usr/local/nginx/conf/nginx.conf #编辑文件
#添加如下内容
proxy_connect_timeout 2400;
proxy_read_timeout 240;
proxy_send_timeout 240;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_request_buffering off;
proxy_cache_lock on;
proxy_cache_valid 200 206 403 1d;#默认全局缓存200,206,403响应状态码 1天
proxy_cache_use_stale updating;
proxy_temp_file_write_size 128k;
#配置缓存目录,以及keys_zone作用域名称
proxy_temp_path /var/tmp/nginx/proxy_temp_dir;
proxy_cache_path /var/tmp/nginx/proxy_cache levels=1:2 keys_zone=link:2m inactive=1d max_size=1g;
#是否忽略后端返回的Cache-Control,Expires响应头。
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;
proxy_ignore_headers Set-Cookie;
#向后端代理传递请求头数据 避免丢失
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Remote-Host $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; # 用户请求协议 https http
或者也可以在http
代码块中使用 include "hhtjim_proxy.conf";
方式载入文件(文件名自定义)。
vhost配置proxy_pass
找到需要配置的vhost主机,修改conf文件中server
代码块
proxy_cache link;
proxy_cache_valid 200 30d;
proxy_cache_valid 301 302 303 10m;
proxy_cache_valid any 5m;
#添加返回响应头,X-Cache标记是否命中缓存。
add_header X-Cache "$upstream_cache_status";
#拦截所有请求 到link负载均衡策略
location / {
proxy_pass http://link;
}
配置负载均衡
依旧在http
块中添加上游upstream
#自定义link名称
upstream link {
ip_hash;#负载均衡ip hash定位.每个请求按访问IP的hash结果分配.解决session问题
server 127.0.0.1:8182 weight=3; #权重为3
server 127.0.0.1:8084 weight=1; #权重为1
keepalive 32;
}
若没有配置多余后端服务,直接使用当前nginx也是可以的。
完整vhost配置记录如下:
#入口拦截
server
{
listen 80;
#listen [::]:80;
server_name www.hhtjim.com ;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/www.hhtjim.com/;
include other.conf;
include enable-php.conf;
proxy_cache link;
proxy_cache_valid 200 30d;
proxy_cache_valid any 5m;
add_header X-Cache "$upstream_cache_status";
location / {
proxy_pass http://link;
}
}
#模拟网站后台程序,数据库处理
server
{
listen 8182;
#listen [::]:80;
server_name localhost ;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/www.hhtjim.com/;
include other.conf;
include enable-php.conf;
#Slim Framework
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log off;
}
重启nginx
lnmp nginx start
#或者 reload 未尝试
# lnmp nginx reload
# ./nginx -s reload
踩坑
- 目录不存在
Starting nginx... nginx: [emerg] mkdir() "/var/tmp/nginx/proxy_temp_dir" failed (2: No such file or directory)
第一次配置完,nginx各种错误,什么缓存目录不存在,proxy_pass
放置代码块不正确。
如果是proxy_temp_dir
目录不存在则自行新建就好,最后记得还要修改权限chmod -R 0777 /var/tmp/nginx/
-
测试发现X-cache一直MISS
确保有忽略掉程序返回的缓存控制响应头 例如Cache-Control
,Expires
。
注意:后台服务器返回的响应头有Cache-Control,Expires,其值nocache
,private
都表示不缓存
,也就会导致全部MISS
。
最后,修改
1.修改后端程序返回的响应头,可控性最高。
2.设置proxy_ignore_headers 忽略掉头部
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;
参考:
http://blog.csdn.net/gamay/article/details/73613741
https://www.lvtao.net/server/224.html
http://blog.csdn.net/zstack_org/article/details/53940047
http://blog.csdn.net/wzx19840423/article/details/50474650
http://blog.51yip.com/apachenginx/1018.html
作者:matrix
发布时间:2017-08-22
分类:零零星星
很多服务器是使用nginx内置的Proxy_cache来缓存资源,防止不必要的后端请求。有时候需要单独清理某个缓存,这就麻烦了。
按照大多数做法是给nginx安装purge模块,但是目前有更加精简的办法使用代码手动删除
道理很简单:获取nginx缓存url的文件路径,然后删除就可以了。
proxy_cache_key缓存的key
nginx 配置了proxy_cache_key的话需要根据自定义的key来获取url的缓存hash值,默认的key一般都是完整的访问url
具体自己的nginx是以什么作为缓存key的,具体随便找个缓存文件vi一下看看,有些设置了upstream负载均衡,就需要替换访问的host为对应主机上的upstream节点名,SO 随便找个缓存文件看看。
缓存路径的拼接
缓存根目录中一般是 单字母/俩字母/32位字符
路径作为缓存的文件存储。
首先需要对key进行md5 Hash的计算,取出最后3位
字符。
单字母
:md5最后一位
双字母
:md5最后2,3位
最后再拼接出完整路径,删除就可以了。
缓存根目录
是nginx中配置的,默认路径就不清楚了。
PHP代码参考,其他语言还请大牛附言~
//去除服务器nginx缓存
$root = '/var/tmp/Tengine/proxy_cache/';
//之所以替换 使用为nginx服务器设置了反向代理proxy_pass
//具体缓存的key还需查看真实的缓存文件的key值
$map = array(
'http://www.hhtjim.com/' => 'http://www_hhtjim_com_backend/',
);
$key = @$args[0];//访问的url链接作为缓存的key
if(empty($key)) die("Please input the cache url eg:http://www.hhtjim.com\n");
$key = str_replace(array_keys($map), array_values($map), $key);
$md5 = md5($key);
$file = sprintf('%s%s/%s/%s', $root, substr($md5, -1), substr($md5, strlen($md5) - 3, 2), $md5);
if (@unlink($file)) {
echo 'DEL SUCCESS:' . $key."\n";die;
}
echo 'FAILED:'.$file."\n";
最后再访问url看看自己服务器响应头配置的$upstream_cache_status变量X-cache缓存标记为MISS
其他状态参考:
MISS 未命中,请求被传送到后端
HIT 缓存命中
EXPIRED 缓存已经过期请求被传送到后端
UPDATING 正在更新缓存,将使用旧的应答
STALE 后端将得到过期的应答
参考:
http://www.jb51.net/article/74595.htm
缓存命中率:http://www.361way.com/nginx-cache/2665.html
peace
作者:matrix
发布时间:2017-04-17
分类:零零星星
http2.0早就开始实行了,忽然间才看到其实很多网站都有使用了http2.0协议,aliyun.com都有了,其他巨头是在打瞌睡吗?
图中显示的Request完全和http1.1的请求完全不同 这,就是高科技!
要求
若想使用http2.0,浏览器和服务器端也都有要求。浏览器用最新版Chrome或其他,服务器端网站配置就麻烦多了。
服务器端OpenSSL库的版本要支持ALPN(1.0.2+ 目前最新为1.1.0e),之前是用SPDY,NPN,后来google只支持ALPN,也就是说未来就是HTTP/2 + ALPN
为什么我们应该尽快支持 ALPN?
需要给网站域名配置证书
nginx版本需要1.9.5+(目前最新版本1.12.0)
若你的服务器openssl或nginx本来就达不到要求,建议都重新安装升级才对。之前只是把openssl升级到最新版本,且Lnmp1.3中的nginx是1.10的版本完全符合要求(其中也有必须的httpv2和ssl模块)就没有给nginx做升级操作,以为可以用http2.0 结果给vhost的conf文件添加了listen 443 ssl http2;
重启nginx N次都没有任何反应,最后还是更新nginx才解决。就是因为之前安装nginx的时候openssl没有达到版本要求,就算升级了服务器openssl也没有卵用。
> openssl version #查看openssl 版本
> nginx -V #查看nginx版本以及模块
服务器配置
环境 ubuntu 14 64bit
LNMP 1.3 NGINX 1.10
升级openSSL库
>openssl version -a #查看openssl 信息 用于升级
>cd #进入默认目录
>wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz
>tar -zxvf ./openssl-1.1.0e.tar.gz
>cd openssl-1.1.0e/
>./config --prefix=/usr/lib/ssl --openssldir=/usr/lib/ssl
#注意--prefix=/usr/lib/ssl为之前openSSL的安装目录,--openssldir表示安装目录 默认值就为/usr/lib/ssl
>make && make install
>mv /usr/bin/openssl /usr/bin/openssl-old
>mv /usr/include/openssl /usr/include/openssl-old
>ln -s /usr/lib/ssl/bin/openssl /usr/bin/openssl
>ln -s /usr/lib/ssl/include/openssl /usr/include/openssl
>echo "/usr/lib/ssl/lib">>/etc/ld.so.conf
>ldconfig
#现在看看版本号就是最新的了
参考:https://www.douban.com/note/563948878/
若升级openssl导致ss服务无法使用参考:
更新OpenSSL库至最新版本导致sss服务无法启动
配置证书
不详细说明,之前有方法安装Let’s Encrypt证书
安装&升级nginx
最新版本1.12.0
本来是使用Lnmp安装目录中自带的upgrade.sh
进行自动升级操作,后来发现有问题,升级时出现openssl library not found
,不过就算是自动升级也不敢保证LNMP编译nginx的时候是否使用的最新版本openssl库,还是手动升级操作。
>wget -O nginx-ct.zip -c https://github.com/grahamedgecombe/nginx-ct/archive/v1.3.2.zip
>unzip nginx-ct.zip
>cd lnmp nginx-1.12.0
>./configure --add-module=../ngx_brotli --add-module=../nginx-ct-1.3.2 --with-openssl=../openssl-1.1.0e --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module
#这里http_v2_module,http_ssl_module,with-openssl才是必须要配置的,其他module看个人实际安装情况
>cd /usr/local/nginx/sbin
>cp nginx nginx.old #备份旧版nginx
>cd ~/nginx-1.12.0
>make upgrade #升级操作
修改vhost中域名配置文件
文件位置:/usr/local/nginx/conf/vhost
修改对应域名的配置文件,在server段中添加listen 443 ssl http2;
就可以了
参考 hhtjim.com:
server
{
listen 80;
listen 443 ssl http2;
#listen [::]:80;
ssl on;
ssl_certificate /etc/letsencrypt/live/hhtjim.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hhtjim.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; #加密算法(CloudFlare 推荐的加密套件组)
ssl_prefer_server_ciphers on; #优化 SSL 加密套件
ssl_session_timeout 10m; #客户端会话缓存时间
ssl_session_cache builtin:1000 shared:SSL:10m; #SSL 会话缓存类型和大小
ssl_buffer_size 1400;
add_header X-UA-Compatible "IE=edge,chrome=1"; #IE 用最新内核渲染页面
server_name hhtjim.com www.hhtjim.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/hhtjim.com;
include other.conf;
#error_page 404 /404.html;
include enable-php.conf;
include wordpress.conf;
if ($http_host !~ "^www.hhtjim.com$"){
rewrite ^(.*) https://www.hhtjim.com$1 permanent;
}
if ($scheme = "http"){
rewrite ^(.*)$ https://$host$1 permanent;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/hhtjim.com.log;
}
重启nginx
>lnmp nginx restart
之后再访问就可以看到使用http2.0协议了
FAQ
若安装失败,请参照 Nginx 配置之完整篇
参考:
https://imququ.com/post/my-nginx-conf.html
http://www.cnblogs.com/shiv/p/5271711.html
http://www.jb51.net/article/47755.htm