Nginx:加强SSL安全等级

在配置之前,我们还需要生成一个密钥,SSH 登录 VPS 后运行以下命令,会在当前目录生成名为 “dhparam.pem” 的密钥文件,备用。

openssl dhparam -out dhparam.pem 2048

将将两个证书和这个生成的pem文件都保存在了 /root 文件夹,现在我们切换到路径 /usr/local/nginx/conf/vhost ,打开虚拟主机对应的配置文件,例如 “roov.org.conf” ,在 server 区段增加以下内容:

listen 443 ssl;

ssl on;

ssl_certificate /root/roov.org.crt;

ssl_certificate_key /root/roov.org.key;

ssl_ciphers “EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH”;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:10m;

add_header Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”; # HSTS

add_header X-Frame-Options DENY;

ssl_dhparam /root/dhparams.pem;

add_header X-Content-Type-Options nosniff;

ssl_session_tickets off; # nginx >= 1.5.9

ssl_stapling on; # nginx >= 1.3.7

ssl_stapling_verify on; # nginx => 1.3.7

resolver 8.8.8.8 8.8.4.4 valid=300s;

resolver_timeout 5s;

其中,”ssl_certificate” 后填写 crt 文件所在路径,”ssl_certificate_key” 后填写 key 文件所在路径,该两文件由沃通提供。”ssl_dhparam” 后填写此前生成的 “dhparam.pem” 文件路径。保存后重启 Nginx 即可生效。在开启 HTTPS 之后 Nginx 负载会比之前略高,不过对于大多数博主而言是感受不到的。

如果需要强制开启 HTTPS ,可以将原 server 区段 “listen 80;” 前添加#变为 “#listen 80;” ,在末尾追加新的 server 区段。内容如下:

server {

listen 80;

server_name roov.org;

rewrite ^(.*)$ https://$host$1 permanent;

}

即可实现强制跳转HTTPS。配置完成后可以到 SSL Labs 测试 SSL 强度,不出意外应该是A+评级。

VPS:通过SSH备份Nginx配置 整站代码和数据库

装lnmp都知道,利用SSH备份是很快很简单的事。其实官方也提供了sh脚本,下载地址脚本下载地址:http://soft.vpser.net/lnmp/backup.sh。

运行前:

需要提前在VPS安装好lftp,lftp功能上比较强大,CentOS直接执行:yum install lftp,Debian执行:apt-get install lftp

需要在VPS上创建/home/backup/ 目录,在FTP上创建backup目录。

根据官方的sh文件修改也行。因为某些方面的需求,我也根据自己的情况修改了一下,觉得更符合用户的需要。

backup.sh内容如下:

#!/bin/bash
#Funciont: Backup website and mysql database
#Author: 皇家元林
#Website: https://hjyl.org/
#IMPORTANT!!!Please Setting the following Values!
######~Set MySQL UserName and password~######
MYSQL_UserName=数据库用户名
MYSQL_PassWord=数据库密码
######~Set MySQL Database you want to backup~######
Backup_Database_Name1=数据库名称
Backup_Database_Name2=数据库名称
Backup_Database_Name3=数据库名称
Backup_Database_Name4=数据库名称
                                
######~Set FTP Information~######
FTP_HostName=FTP地址
FTP_UserName=用户名
FTP_PassWord=密码
FTP_BackupDir=/home/backup #路径
                                
#Values Setting END!
TodayWWWBackup=xhjyl_$(date +"%Y%m%d").tar.gz
TodayDBBackup=db-*-$(date +"%Y%m%d").sql.gz
OldWWWBackup=xhjyl_$(date -d -7day +"%Y%m%d").tar.gz
OldDBBackup=db-*-$(date -d -7day +"%Y%m%d").sql.gz
                                
# backup nginx configure files
tar -czvf /home/wwwroot/nginx_conf_$(date +%Y%m%d).tar.gz /usr/local/nginx/conf/vhost
                                
#backup mysql
/usr/local/mysql/bin/mysqldump --add-drop-table -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name1 | gzip > /home/backup/db-$Backup_Database_Name1-$(date +"%Y%m%d").sql.gz
/usr/local/mysql/bin/mysqldump --add-drop-table -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name2 | gzip > /home/backup/db-$Backup_Database_Name2-$(date +"%Y%m%d").sql.gz
/usr/local/mysql/bin/mysqldump --add-drop-table -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name3 | gzip > /home/backup/db-$Backup_Database_Name3-$(date +"%Y%m%d").sql.gz
/usr/local/mysql/bin/mysqldump --add-drop-table -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name4 | gzip > /home/backup/db-$Backup_Database_Name4-$(date +"%Y%m%d").sql.gz
                                
# backup wwwroot and mysql
tar -czvf /home/backup/xhjyl_$(date +%Y%m%d).tar.gz /home/wwwroot --exclude=ftp --exclude=phpmyadmin
rm $OldWWWBackup
rm $OldDBBackup
cd /home/backup
lftp fish://$FTP_UserName:$FTP_PassWord@$FTP_HostName << EOF
cd $FTP_BackupDir
mrm $OldWWWBackup
mrm $OldDBBackup
mput $TodayWWWBackup
mput $TodayDBBackup
bye
EOF

这里需要说明一下不同地方:我这里添加了Nginx的配置,并备份到/home/wwwroot,所以直接跟整站代码一起打包就好了。至于数据库还是分开打包好,不然数据库太大,容易导出却不容易导入。 --exclude=ftp 这个ftp是不需要打包的文件夹。最后是lftp,我这里是直接发到我另外一个VPS上,因为那个搭建FTP,所以用SFTP的功能。经过测试,这段代码是正常的。即使在运行的时候,开始有tar: Removing leading `/’ from member names 这样的警告,那是正常的,这表示:

这样的一个压缩包,如果我们再去解开,就会当前目录(也即此例中的“~”)下再新建出“./home/robin/” 两级目录。对于这样的压缩包,解压方法是使用参数 “-C”指解压的目录为根目录(“/”):tar -xzvf robin.tar.gz -C /

如果强制使用绝对路径,可加上P参数。比如tar -czvPf robin.tar.gz /home/robin/

完了。

Nginx下解决 https跳转出现400 Bad Request

错误:

400 Bad Request: The plain HTTP request was sent to HTTPS port

因为/usr/local/nginx/conf/nginx.conf 配置中会 include fcgi.conf
所以我们去修改fcgi.conf添加一个HTTPS的参数

[root@*** ~]# vi /usr/local/nginx/conf/fcgi.conf
           
fastcgi_param  HTTPS $fastcgi_https;

再修改域名对应的conf文件,在最上面加入如下代码:

map $scheme $fastcgi_https {
    default off;
    https on;
    }

记得不要放到server里面 ,否则会报错

就是说上面这段代码完了之后才是server{…}的section。

 

保存退出,然后运行

/usr/local/nginx/sbin/nginx -t

检查一下有没有错误

 

然后/root/lnmp restart

转自http://yywudi.info/nginx-https-400-bad-request-solution/

—————

此为记录,还没试过这种情况!

lnmp下Nginx服务器设置防盗链最简单方法

因为nginx不支持.htaccess,所以在防盗链上比较麻烦。
1.确定要修改的文件
如果你安装lnmp后,没有新建站点,而是使用默认站点,那你需要修改的文件是/usr/local/nginx/conf/nginx.conf
如果你新建了站点,那么要修改的文件是/usr/local/nginx/conf/vhost/这个文件夹下面的相应文件,通常应该是 域名.conf
2.根据你的情况,下载或者打开相应的.conf文件,注意先备份
找到下面内容

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

把它修改为类似下面的样子

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
valid_referers none blocked www.domin.com domin.com;
if ($invalid_referer) {
rewrite ^/ http://otherdomin.com/404.jpg;
#return 404;
}
expires 30d;
}

特别说明:
以上都不是真正防盗链,但是在其他网站调用的本站图片都已经作了防护了,如果用户通过浏览器直接输入图片地址或下载地址,仍然会显示图片,仍可下载文件,因为 valid_referers 里多了“none blocked”。
最后说下ngingx下如何彻底地实现真正意义上的防盗链,那就是把“none blocked”去掉,这样浏览器直接输入就不会显示图片了(别忘了改成自己的域名)

你要修改的地方
gif|jpg|jpeg|….,这些是你想要屏蔽的文件类型,可以根据情况修改
domin.com www.domin.com,修改为你网站的域名,或者是你允许显示你网站图片的其他网站域名,注意中间用空格分开,而不是逗号
http://otherdomin.com/404.jpg,显示给盗链者看到的图片,注意不要放到domin.com上,因为放盗链的作用,那样对方是看不到的,可以上传到一些支持外联的网络相册上。
3.保存修改后的文件,上传覆盖原始文件
需要重新启动lnmp后才能看到效果,命令是
停止lnmp:/root/lnmp stop
启动lnmp:/root/lnmp start
这样我们就实现了图片的防盗链,实际效果看下面
对了   不要忘了重启lnmp:
/root/lnmp restart
转自原文

nginx启动报错nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx启动报错,信息如下:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
…..
 
使用ps ef|grep nginx,并未发现有nginx进程,有可能被其他进程占用,这时可以采用如下方式处理:
 
1. 查看80端口占用
netstat -ntpl
 
2. 杀掉占用80端口的进程
 
kill -9 $pid  //这个$pid就是端口
转自http://genggeng.iteye.com/blog/1181665