切割Nginx日志文件

以前用Apache的时候有自带个叫rotatelogs的工具,只需要修改httpd.conf文件就可以轻松简单分割日志文件。
不过Nginx并没有自带这样的工具,还需要写脚本用crontab执行。

#!/bin/bash
#设置日志文件目录
logs_path="/home/wwwlogs/"
#设置pid文件
pid_path="/usr/local/nginx/logs/nginx.pid"

#重命名日志文件
mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log

#向nginx主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`

其中日志文件目录和pid目录请根据自已的情况更改,pid文件存放的目录打开nginx.conf就可以看到了。

平常kill命令经常拿来杀进程,在这里用了个-USR1参数,在网上查了一下,有这样一段说明:

USR1亦通常被用来告知应用程序重载配置文件;例如,向HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。

真素打开了新世界的大门

最后把上面那段脚本保存,比如我们存在/usr/local/nginx/rotatelogs.sh
然后设置每天凌晨12点执行这段脚本:

0 0 * * * bash /usr/local/nginx/rotatelogs.sh

如果你有多个网站,多个日志的话,在重命名日志文件那里多加相应的几个进去就可以了。
像博主这样VPS没有默认安装crontab的,可以yum install crontabs。
然后再使用crontab -e命令进行脚本的添加。
一般来说都会打开一个vi编辑器,具体就请参照vi编辑器的用法啦。

补充:

在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+%Y%m%d’。
我们的脚本里也有类似的表示日期的,不过不是直接写在crontab里就不用考虑转义了。

参考:

nginx日志切割

NGINX 已支持 SERVER PUSH

2018-02-20 刚刚更新的 nginx-1.13.9 已支持 HTTP/2 的特性 Server Push ,这个特性目的是让服务端将部分资源主动推送给浏览器,节约浏览器需要使用这些资源时再次发送 Get 请求的时间。很长的一段时间内 Nginx 都是不支持这个特性的,不过在新版本中已经可以使用,详细改动可以查看 http://hg.nginx.org/nginx/rev/641306096f5b

Nginx 中的 Server Push 提供两个选项:

直接指定需要推送的资源,Nginx 会直接推送(只能使用相对链接)。

http2_push  /css/style.css;

使用 W3C文档 规定的 Link 字段作为 HTML 响应。

Link: </style.css>; as=style; rel=preload;

然后在配置中开启

http2_push_preload on;

为了方便,我选择第一种方式,直接指定需要推送的资源文件。之后在 Chrome 的 Developer Tools —— Network 面板中可以看到我指定推送的资源状态为 Push 。

Nginx 配置 HTTP 跳转 HTTPS

本文介绍 Nginx 访问 HTTP 跳转 HTTPS 的 4 种配置方式。

1. rewrite

Nginx rewrite 有四种 flag:

  • break:在一个请求处理过程中将原来的 url 改写之后,再继续进行后面的处理,这个重写之后的请求始终都是在当前这一个 location 中处理
  • last:相当于一个新的 request,需要重新走一遍 server,提供了一个可以转到其他 location 的机会
  • redirect:表示 302 temporarily redirect
  • permanent:表示 301 permanently redirect

要使用 HTTP 跳转 HTTPS,当然是需要 301 跳转,即使用 permanent 这个标签:

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

提醒:以上配置涉及到三个本文并未提及的点:rewrite 用法、全局变量、正则匹配。

2. 301 状态码

Nginx 使用 ruturn ${http_code} 指定对应状态码的处理。这里我们使用 return 301 指定 301 重定向的目标:

return  301  https://$server_name$request_uri;

3. 497 状态码

当 server 只允许 HTTPS 请求时,基于 HTTP 的访问会被 Nginx 返回 497 错误。这时我们使用 error_page 将访问重定向至 HTTPS 上:

error_page  497  https://$server_name$request_uri;

4. meta

还有一种方式是,返回一个写入 meta 标签的 html 页面,让浏览器跳转。和上面三种方式不同,此方案不在 Nginx 上进行跳转,节约服务器资源,而缺点是不能写入 $request_uri 变量,只能跳转到固定地址。

server {
    ...

    index  meta.html;
    error_page 404 meta.html;
}

在要返回的 meta.html 中写入:

<html>
  <meta http-equiv="refresh" content="0; url=${你要跳转的目标地址}">
</html>

本站就使用这个方案,所以我是这样写的:

<html>
  <meta http-equiv="refresh" content="0; url=https://sometimesnaive.org/">
</html>

nginx配置正向代理支持HTTPS

未分类

nginx当正向代理的时候,通过代理访问https的网站会失败,而失败的原因是客户端同nginx代理服务器之间建立连接失败,并非nginx不能将https的请求转发出去。因此要解决的问题就是客户端如何同nginx代理服务器之间建立起连接。有了这个思路之后,就可以很简单的解决问题。我们可以配置两个SERVER节点,一个处理HTTP转发,另一个处理HTTPS转发,而客户端都通过HTTP来访问代理,通过访问代理不同的端口,来区分HTTP和HTTPS请求。

#HTTP
server{
resolver 8.8.8.8;
access_log /data/logs/nginx/access_proxy.log main;
listen 80;
location / {
root html;
index index.html index.htm;
proxy_pass $scheme://$host$request_uri;
proxy_set_header HOST $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#HTTPS
server{
resolver 8.8.8.8;
access_log /data/logs/nginx/access_proxy.log main;
listen 443;
location / {
root html;
index index.html index.htm;
proxy_pass https://$host$request_uri;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

如果访问HTTP网站,可以直接这样的方式: curl –proxy proxy_server:80 http://www.taobao.com/
如果访问HTTPS网站,例如https://www.alipay.com,那么可以使用nginx的HTTPS转发的server:
curl –proxy proxy_server:443 http://www.alipay.com

2013年12月9日补记:

之前nginx配置透明代理的时候,没有特别针对端口的配置,如果之前的url是http://www.test.com:8080/这样的地址过来,通过nginx转发之后实际到了http://www.test.com:80/上面,为了修复这个问题,增加如下配置:

proxy_pass http://$host:$cookie_passport$request_uri;

其中$cookie_是获取请求中cookie的信息,这个passport的cookie值是原URL中端口号。由此可以看出,如果要通过该NGINX转发,需要首先设置一个cookie,这个cookie名为passport,cookie的值为原url中的端口号。

如果使用CURL命令请求链接,可以这样子:

curl -b passport=80 --proxy proxy_server:80 http://www.taobao.com/

其中-b参数是为了添加cookie

nginx 出现504 Gateway Time-out的解决方法

本文介绍nginx出现504 Gateway Time-out问题的原因,分析问题并提供解决方法。

1. 问题分析

nginx访问出现504 Gateway Time-out,一般是由于程序执行时间过长导致响应超时,例如程序需要执行90秒,而nginx最大响应等待时间为30秒,这样就会出现超时。

通常有以下几种情况导致

1.程序在处理大量数据,导致等待超时。
2.程序中调用外部请求,而外部请求响应超时。
3.连接数据库失败而没有停止,死循环重新连。

出现这种情况,我们可以先优化程序,缩短执行时间。另一方面,可以调大nginx超时限制的参数,使程序可以正常执行。

对于访问超时的设定,nginx与php都有相关的设置,可以逐一进行修改。

2. 解决方法

nginx配置

nginx.conf中,设置以下几个参数,增加超时时间

fastcgi_connect_timeout 

fastcgi连接超时时间,默认60秒

fastcgi_send_timeout 

nginx 进程向 fastcgi 进程发送请求过程的超时时间,默认值60秒

fastcgi_read_timeout 

fastcgi 进程向 nginx 进程发送输出过程的超时时间,默认值60秒

php配置

php.ini

max_execution_time 

php脚本最大执行时间

php-fpm

request_terminate_timeout 

设置单个请求的超时时间

php程序中可加入set_time_limit(seconds)设置最长执行时间

例如 set_time_limit(0) 表示不超时。

NGINX实现图片防盗链(REFERER指令)

Nginx referer指令简介

nginx模块ngx_http_referer_module通常用于阻挡来源非法的域名请求.我们应该牢记,伪装Referer头部是非常简单的事情,所以这个模块只能用于阻止大部分非法请求.我们应该记住,有些合法的请求是不会带referer来源头部的,所以有时候不要拒绝来源头部(referer)为空的请求.

图片防盗链一般配置:

location ~* .(jpg|jpeg|bmp|gif|png|css|js|ico|webp|tiff|ttf|svg) {
    valid_referers none blocked *.wuditnt.com wuditnt.com ~.google. ~.baidu.;
    if ($invalid_referer) {
        return 403;
        #rewrite ^/ http://XXXX/403.gif; ##这个图片不能被防盗链,不然显示不正常。除非把上面的GIF过滤删除。
    }
    expires 30d;
}

以上所有来至*.wuditnt.com和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.gif。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则.

!!!!!!!!!

注意: http://XXXX/403.gif; ##这个图片不能被防盗链,不然显示不正常,会出现重复过滤。

除非把上面(jpg|jpeg|bmp|gif|png|css|js|ico|webp|tiff|ttf|svg) 中的gif过滤删除。

不过这个不是真正的防盗链方式,右键点击保存图片链接,还是可以在浏览器中显示的。

网上有的人说把none blocked删除掉,就形成了真正的防盗链方式,还有待测试。

!!!!!!!!!!

疑问:

经过测试,这个设置方式对Google Chrome的隐身模式和手机的Chrome浏览器似乎无效,一样可以看到图片。

其他浏览器如猎豹、微软的Edge、IE都有效果。

语法说明

valid_referers none | blocked | server_names | string …;
默认值: —
配置段: server, location
指定合法的来源’referer’, 它决定了内置变量$invalid_referer的值,如果referer头部包含在这个合法网址里面,这个变量被设置为0,否则设置为1.记住,不区分大小写的.

参数说明

none:“Referer” 来源头部为空的情况
blocked:“Referer”来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头.
server_names:“Referer”来源头部包含当前的server_names(当前域名)
arbitrary string:任意字符串,定义服务器名或者可选的URI前缀.主机名可以使用*开头或者结尾,在检测来源头部这个过程中,来源域名中的主机端口将会被忽略掉
regular expression:正则表达式,~表示排除https://或http://开头的字符串.

宝塔部署ubuntu+nginx+flask环境

准备

  1. 搭建好宝塔的vps,我用的是vultr
  2. flask应用在本地运行成功

在宝塔界面添加网站

  1. 设置好域名,数据库,php版本不管,或者在软件管理中卸载php
  2. 创建的web文件在/www/wwwroot/目录下
  3. 在本地的flask应用文件打包上传到刚刚创建的web文件中,解压

创建Python环境

$ sudo apt install python3-venv
$ python3 -m venv venv
# 如果venv/bin/下没有activate,就表示没有成功,解决如下
$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"
$ sudo dpkg-reconfigure locales
# 进入虚拟环境
$ source venv/bin/activate
# 安装uWSGI和requirements
$ pip install uwsgi
$ pip install -r requirements.txt
# 退出虚拟环境
$ deactivate

配置uwsgi

在应用根目录创建config.ini文件,内容如下

[uwsgi]
# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8386
# 指向网站目录
chdir = /www/wwwroot/www.itswcg.site
# python 启动程序文件
wsgi-file = main.py
# python 程序内用以启动的 application 变量名
callable = app 
# 处理器数
processes = 4
# 线程数
threads = 2
#状态检测地址
stats = 127.0.0.1:9191

配置nginx

在宝塔面板中,管理网站,设置,配置文件修改如下,
或者在/www/server/panel/vhost/nginx/.conf下修改

server {
  listen  80; 如有多个web应用,都是80端口监听
  server_name resume.itswcg.com; #地址
  location / {
    include      uwsgi_params;
    uwsgi_pass   127.0.0.1:8386;  # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
    uwsgi_param UWSGI_PYHOME /www/wwwroot/www.itswcg.site/venv; # 指向虚拟环境目录
    uwsgi_param UWSGI_CHDIR  /www/wwwroot/www.itswcg.site; # 指向网站根目录
    uwsgi_param UWSGI_SCRIPT main:app; # 指定启动程序
  }
}

重启

$ sudo service nginx restart

这时候运行如下,不出错,输入网址就成功了

$ uwsgi config.ini

配置supervisor

supervisor能同时启动多个应用,能自动重启应用,保证可用性。
安装

$ sudo apt-get install supervisor

在/etc/supervisor/conf.d下添加.conf文件(resume.conf),内容如下

[program:resume] #resume是<name>
##注意项目目录和uwsgi的配置文件地址
command=/www/wwwroot/www.itswcg.site/venv/bin/uwsgi /www/wwwroot/www.itswcg.site/config.ini
directory=/www/wwwroot/www.itswcg.site
autostart=true
autorestart=true
user = root
##log文件的位置
stdout_logfile=/www/wwwroot/www.itswcg.site/logs/uwsgi_supervisor.log

启动

supervisord -c /etc/supervisor/supervisord.conf

客户端管理

$ supervisorctl

这样你就不用每次重启时都运行$ uwsgi config.ini,supervisor帮你自动重启

还有别忘了在宝塔面板安全中,放行端口

未分类

禁止通过IP访问——nginx

有时我们只希望能够通过域名访问,而不希望通过ip访问,这就需要设置nginx.conf配置文件了,现总结如下:

  • 禁止通过http方式访问

主要实现代码如下:

server
 {
    listen 80 default_server;
    server_name _;
    return 500;
  }
  • 禁止通过https防止访问

一定要SSL证书,不然会导致域名也无法访问!证书可以随便填,直接填920.ai域名证书的路径

server 
    {
        listen 443 default_server;
        server_name _;
        ssl on;
        ssl_certificate /etc/letsencrypt/live/920.ai/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/920.ai/privkey.pem;
        return 500;
    }

nginx端口映射tcp

添加到

/etc/nginx/nginx.conf

添加内容:

stream {
    upstream ssr {
        hash $remote_addr consistent;
        server 127.0.0.1:31905 weight=5 max_fails=3 fail_timeout=30s;
    }
    server {
       listen 4008;
       proxy_connect_timeout 1s;
       proxy_timeout 3s;
       proxy_pass ssr;
    }
}

监听4008,映射到127.0.0.1:31905,名字ssr。

CentOS下安装gperftools优化nginx

一、下载软件包

http://mirror.yongbok.net/nongnu/libunwind/libunwind-1.1.tar.gz  #下载libunwind

https://gperftools.googlecode.com/files/gperftools-2.0.tar.gz   #下载gperftools
上传软件包到服务器的/usr/local/src目录下面

二、安装gperftools

1、安装libunwind(安装gperftools前需要先安装libunwind)

cd /usr/local/src  #进入安装目录
tar zxvf libunwind-1.1.tar.gz  #解压
cd libunwind-1.1
./configure #配置
make #编译
make install #安装

2、安装gperftools

cd /usr/local/src
tar zxvf gperftools-2.0.tar.gz
cd gperftools-2.0 #进入目录
./configure --enable-frame-pointers #配置
make
make install

3、配置gperftools

vi /etc/ld.so.conf.d/usr_local_lib.conf  #编辑,添加以下内容
/usr/local/lib
:wq! #保存退出

/sbin/ldconfig  #执行此命令

cd /usr/local/src/nginx-1.2.4 #进入nginx安装包目录

./configure --prefix=/usr/local/nginx --with-google_perftools_module --without-http_memcached_module --user=www --group=www --with-http_stub_status_module --with-openssl=/usr/ --with-pcre=/usr/local/src/pcre-8.31
#重新配置nginx,添加--with-google_perftools_module参数

make #编译
make install  #安装

mkdir /tmp/tcmalloc  #新建目录
chmod  777 /tmp/tcmalloc -R  #设置目录权限

4、配置nginx

未分类

vi /usr/local/nginx/conf/nginx.conf #编辑,在#pid logs/nginx.pid;这行的下面添加
google_perftools_profiles /tmp/tcmalloc;
:wq! #保存退出
service nginx restart  #重启nginx

三、测试

lsof -n | grep tcmalloc #测试tcmalloc
lsof -n | grep nginx  #测试nginx

未分类

未分类

至此,CentOS下安装gperftools优化nginx完成。