存档

‘nginx技巧’ 分类的存档

ubuntu中nginx配置ssl证书使用https,外加阿里云cdn配置详解

2019年6月11日 没有评论

在ubuntu系统中nginx配置ssl证书使用https如何操作?

我的操作案例中将http://aaa.com和http://ww.aaa.com解析到了源服务器IP,在源服务器nginx里面http段增加了server如下代码:(代码标记①)

server{
        listen 80;
	#如果域名没使用阿里云cdn,那么此处应该增加一个www.aaa.com
	#不带www和ww解析到了本服务器的80端口,而www解析到了阿里云
	#阿里云ssl证书控制台要将证书部署到cdn
	#阿里云cdn控制台要将源站ip端口改为443,回源配置中的回源SNI要设置为www.aaa.com,https配置中开启强制跳转
	#等于80端口将server_name全部301到443端口
        server_name aaa.com ww.aaa.com;
	rewrite ^(.*) https://www.aaa.com$1 permanent;
}

主要用来将http:// aaa.com和http:// ww.aaa.com自动跳转至https://www.aaa.com(那么此处会遗留一个问题,就是http://www.aaa.com如何跳转至https://www.aaa.com呢?刚刚添加的代码中已经解释了,要开启阿里云cdn的https配置中开启强制跳转),由此就解决了http://aaa.com和http:// ww.aaa.com和http://www.aaa.com全部301跳转至https://www.aaa.com。

需要注意的是,阿里云的配置有几处需要修改:
1,阿里云ssl证书控制台要将证书部署到cdn
2,阿里云cdn控制台要将源站ip端口改为443
3,回源配置中的回源SNI要设置为www.aaa.com
4,https配置中开启强制跳转

好了,接下来就是本机服务器的配置ssl使用https来监听443端口了,到/etc/nginx/conf.d.my目录下(我自己新建的配置文件目录是conf.d.my,利于打理),新建ssl_cert用于存放证书目录,/etc/nginx/conf.d.my/ssl_cert,在nginx的http段中增加相应的server代码:(代码标记②)

server {
	#只监听443 ssl,需要单独加server listen 80
	listen 443 ssl;

	#80和443同时可以访问
	#listen 80;
	#listen 443 default ssl;		

	#nginx 1.15版本如果使用listen 443 ssl,删除ssl on就行了
	#ssl on;

	server_name www.aaa.com;

	ssl_certificate conf.d.my/ssl_cert/www.aaa.com.pem;
	ssl_certificate_key conf.d.my/ssl_cert/www.aaa.com.key;
	ssl_session_timeout 5m;
	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_prefer_server_ciphers on;

	root /www/webroot/aaa.com/;
	#下面的代码是我自己的配置,网友需要更改为自己的实际情况
	include /etc/nginx/conf.d.my/server/agent.deny.conf;
	include /www/webroot/aaa.com/.htaccess;
	location / {
		try_files $uri $uri/ =404;
		index index.html index.php index.htm;
	}
	location ~ \.php$ {
		include fastcgi_params;
		include /etc/nginx/conf.d.my/location/fastcgi_params;
		include /etc/nginx/conf.d.my/location/limit_req;
		fastcgi_param PHP_ADMIN_VALUE "open_basedir=/www/webroot/aaa.com/:/tmp/";
	}
	location ~ /\.htaccess {
		deny all;
	}
}

特别注意,上方的代码中:
ssl_certificate conf.d.my/ssl_cert/www.qibangkeji.com.pem;
ssl_certificate_key conf.d.my/ssl_cert/www.qibangkeji.com.key;
不能使用绝对路径,比如不能写成:/etc/nginx/conf.d.my/ ssl_cert/www.qibangkeji.com.pem; 否则会报错。

以上就是ubuntu中nginx配置ssl证书使用https,外加阿里云cdn配置详解。如有错误欢迎指正。

当然,如果不使用阿里云的cdn,就将www和不带www的和ww都解析到源服务器IP,然后修改代码片段①即可:

server{
        listen 80;
        server_name aaa.com ww.aaa.com www.aaa.com;
	rewrite ^(.*) https://www.aaa.com$1 permanent;
}

更新nginx或者其他软件提示doesn’t support architecture ‘i386’

2019年5月24日 没有评论

在安装nginx或者其他软件的时候可能会提醒nginx doesn’t support architecture ‘i386’

这个问题通过google搜索,可以得到解决:

Edit /etc/apt/sources.list.d/nginx.list

Change:
deb http://nginx.org/packages/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/ubuntu/ bionic nginx

To:
deb [arch=amd64] http://nginx.org/packages/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/ubuntu/ bionic nginx

Doing another apt-get update after this change it worked fine.

参考链接:https://www.lightnetics.com/topic/16739/n-skipping-acquire-of-configured-file-nginx-binary-i386-packages-as-repository-http-nginx-org-packages-ubuntu-bionic-inrelease

参考链接:https://askubuntu.com/questions/1023009/repository-http-miktex-org-download-ubuntu-xenial-inrelease-doesnt-support?noredirect=1&lq=1

分类: nginx技巧 标签:

nginx实现apache的功能php_admin_value open_basedir

2018年8月8日 没有评论

nginx实现apache的功能php_admin_value open_basedir

今天将apache下面的所有虚拟主机站点改成nginx+php-fpm模式运行
考虑到虚拟主机的安全性不受各个站点的影响,所以需要在nginx下实现和apache一样的功能:php_admin_value open_basedir
也就是所说的:防跨目录设置
在apache中,我们只要在加入php_admin_value open_basedir就可以实现
比如:站点路径为/www/webroot/aaa.com
那么就是:php_admin_value open_basedir “/www/webroot/aaa.com:/tmp”
加入tmp是为了不影响用户上传文件,因为会先往临时目录上传

接下来就要进入主题,如何在nginx实现apache的功能php_admin_value open_basedir

查阅了相关文档,本人推荐的实现方式只有1种,方便,快捷,可拓展
当然还有一种其次的推荐方式,先聊聊第一种推荐的吧

======================
第一种:

在每个虚拟主机的server {}的location ~ \.php$ {}中增加:
fastcgi_param PHP_ADMIN_VALUE “open_basedir=/www/webroot/aaa.com/:/tmp/”;
注意,nginx下面,如果你输入的是:aaa.com(而不是aaa.com/)(结尾有/),就会造成是模糊匹配
比如aaa.com额aaa.com.cn,这2个都可以有权限访问

保存,重启nginx+php-ftpm就可以实现效果了
但是,很不幸,如果你有多个虚拟主机站点,访问aaa.com一切正常,访问bbb.com会时而报错:
no input file specified

这个原因是你有多少个虚拟主机,就要把全部虚拟主机的server {}的location ~ \.php$ {}中增加上,不要只增加某一个
否则会报错:no input file specified

一开始我调试的时候,只加了一个aaa.com,其他没加,网上找了很多方法都不行,后来不知脑袋怎么就考虑到要把全部的加上。

===================
第二种:

这种方法不是很推荐,因为需要在每个网站的根目录下增加一个文件,不方便拓展和管理

在每个虚拟主机的根目录下,增加.user.ini文件
比如aaa.com/.user.ini
.user.ini文件的内容就是:
open_basedir=/www/webroot/aaa.com/:/tmp/

当然还需要开启php.ini中的2个参数
sudo vim /etc/php/5.6/fpm/php.ini
开启:
user_ini.filename
user_ini.cache_ttl

重启php-fpm就可以生效了,这个等于不用配置nginx,当然也可以不用重启php-fpm,等待user_ini.cache_ttl设置的时间后,自动生效

这种方法,如果需要把ftp给别人,或者当某个虚拟主机站点受到黑客的时候,会造成.user.ini被串改或者被删除,等待

所以,还需要将文件的权限设置下:
sudo chattr +i /www/webroot/aaa.com/.user.ini
这样ftp里面就无法修改,删除,重命名该文件
当你想要自己修改的时候,进入服务器
sudo chattr -i /www/webroot/aaa.com/.user.ini
就可以重新操作了(+和-参数的区别)
具体chattr命令的参数,可以自行百度

==========================

使用了第二种方法,可以只对某个虚拟主机增加.user.ini,其他虚拟主机访问的时候并不会出现报错:no input file specified
这点和第一种方法不一样,第一种方法必须要把所有的都加上,才能保证每个虚拟主机都能正常访问

php-fpm模式下间歇性无法获取不到$_SERVER或者$_REQUEST数据

2018年7月3日 没有评论

最近安装了一台新的服务器,nginx+php-fpm模式

使用过程中发现$_SERVER或者$_REQUEST(不排除$_POST或者$_GET)间歇性无法获取数据

但是只要重启php-fpm服务就可以解决,但是运行一段时间之后又会反复出现

由此分析应该为php-fpm问题(重启可以解决,个人推测为php-fpm进程问题),一开始以为是当前版本php的bug,后来降低php版本后依然存在,找了很多google资料,都没有遇到类似问题。

花了2天左右时间,对服务器软件配置文件参数逐一排查调试,都没有找到问题所在。

最后,只能从拓展插件上着手,暂时锁定了问题所在:

xcache拓展和opcache拓展建议只开启一个,似乎discuz里面用的是xcache,所以建议只安装xcache
在php-fpm模式下,如果同时安装xcache和opcache,会导致莫名其妙的$_SERVER或者$_REQUEST无法获取数据(间歇性)

所以个人推测:2个都用的话(双层cache)会导致php-fpm的部分进程假死,前段请求发送到假死的进程上后,则无法返回数据,当发送到没假死的进程就可以返回数据(当重启php-fpm服务又正常了)

关闭opcache拓展后,目前运行了近1.5天,已经没有发现此问题。

nginx配置反向代理使用discuz的时候无法加载验证码和安全问答

2018年6月22日 没有评论

今天配置nginx反向代理的时候,发现无法加载验证码和安全问答问题

经过研究和谷歌搜索,发现原来discuz会在头部判断用户来源

所以解决办法是在nginx的虚拟主机配置中加入:

proxy_pass_header User-Agent;

proxy_set_header Host $host;

这样才能正确加载discuz中的验证码和安全问题

如果你也遇到了在nginx中无法加载discuz中的验证码,请使用上方同样的方法,我列举一个虚拟主机的配置例子:

server {
listen 80;
server_name bbs.aaa.com;
location / {
proxy_pass http://bbs.aaa.com:82;
proxy_redirect http://bbs.aaa.com:82/ /;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header User-Agent;
proxy_set_header Host $host;

}
access_log logs/bbs.aaa.com.access.log;
}

css.php