存在的记忆 - Nginx
type: channel
link: https://www.looaon.com/index.php/tag/Nginx/
items: Ubuntu下-Nginx安装并设置开机自启
items: 腾讯云镜像环境502处理思路
items: tengine 安装redis2-nginx-module模块
items: 如何在 ELB 访问日志中捕获客户端 IP 地址？
items: 宝塔nginx自编译云锁web防护教程
items: nginx 反向代理
items: nginx 日志分析
items: nginx upsteam 分配方式
items: Nginx下常见报错
items: web 优化大事项（nginx）

Ubuntu下-Nginx安装并设置开机自启
type: item
date: 2020-03-04T18:05:00+08:00
description: 开机自启在/etc/init.d/目录下创建名为nginx的文件：sudo touch /etc/init.d/nginx 编辑如下内容：#!/bin/bash set -e PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="nginx daemon" NAME=nginx DAEMON=/usr/local/nginx/sbin/$NAME SCRIPTNAME=/etc/init.d/$NAME # If the daemon file is not found, terminate the script. test -x $DAEMON || exit 0 d_start() { $DAEMON || echo -n " already running" } d_stop() { $DAEMON –s quit || echo -n " not running" } d_reload() { $DAEMON –s reload || echo -n " could not reload" } case "$1" in start) echo -n "Starting $DESC: $NAME" d_start echo "." ;; stop) echo -n "Stopping $DESC: $NAME" d_stop echo "." ;; reload) echo -n "Reloading $DESC configuration..." d_reload echo "reloaded." ;; restart) echo -n "Restarting $DESC: $NAME" d_stop # Sleep for two seconds before starting again, this should give the # Nginx daemon some time to perform a graceful stop. sleep 2 d_start echo "." ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2 exit 3 ;; esac exit 0 脚本授权chmod +x /etc/init.d/nginx 加入开机启动sysv-rc-conf 界面说明(上下键切换到nginx选项，空格选中，q保存退出)运行级别说明： S 表示开机后就会运行的服务 0 表示关机 1 表示单用户模式 （类似windows的安全模式） 2 表示无网络服务的多用户模式 3 表示多用户模式 4 系统预留（暂没使用） 5 表示多用户图形模式 6 表示重启其他命令（以下代码未测试）#设置开机启动nginx sudo update-rc.d –f nginx defaults #移除nginx开机启动 update-rc.d -f nginx remove #开启开机启动 sysv-rc-conf nginx on #nginx操作命令 service nginx -s reload | stop | restart | start

腾讯云镜像环境502处理思路
type: item
date: 2020-01-03T10:40:00+08:00
description: 网站报错502，先在配置文件里配上日志access_log /var/log/666.log; error_log /var/log/666.error.log; 查看错误日志2020/01/03 10:14:52 [crit] 14674#0: *28 connect() to unix:/run/php-fpm/php7.0-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 123.160.132.123, server: 123.54.142.123, request: "GET /1.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/php7.0-fpm.sock:", host: "123.54.142.123" 新的环境出现502,网上所谓的由于 php 参数设置导致的可能性非常小，根据经验可以排除停止和启动php(新手命令)service php-fpm stop service php-fpm start nginx 配置路径/etc/nginx/conf.d 查到配置文件是以9000 端口监听php的fastcgi_pass 127.0.0.1:9000 查询是否监听9000 端口（配置文件）netstat -ant | grep 9000 查询php是否启动ps aux|grep php 找到php的配置文件/etc/php-fpm.conf 发现最后一行etc/php-fpm.d/*.conf，进去找到php对应版本的配置文件etc/php-fpm.d/www.conf，在文件中查找 listenlisten = /dev/shm/php-fpm-default.sock 此时我们需要根据配置文件的listen地址做对应的修改： location ~ .+\.php($|/) { set $script $uri; set $path_info ""; if ($uri ~ "^(.+\.php)(/.+)") { set $script $1; set $path_info $2; } fastcgi_pass unix:/dev/shm/php-fpm-default.sock;(这里的路径就是上面我们找到的) #fastcgi_pass 127.0.0.1:9000;（注释掉原始配置） fastcgi_index index.php?IF_REWRITE=1; fastcgi_param PATH_INFO $path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $script; include fastcgi_params; 处理完记得重启nginx -s reload

tengine 安装redis2-nginx-module模块
type: item
date: 2019-12-28T18:39:00+08:00
description: 先下载模块，我是下载在 /www/server/nginx/（宝塔环境）cd /www/server/nginx/ git clone https://github.com/openresty/redis2-nginx-module.git 2.1 因上线的业务正在运行着nginx程序，需要先查看当前nginx编译参数。nginx -V Tengine version: Tengine/2.2.0 (nginx/1.8.1) built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) TLS SNI support enabled configure arguments: --prefix=/etc/nginx --with-pcre=../pcre-8.36 --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf …… 2.3 重新编译nginx，可运行make，不要make installcd /usr/local/src/tengine-2.2.0 ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf ... --add-module=/usr/local/src/nginx-module-vts make 2.4 替换原nginx命令，替换完成之后一定要重启nginx否则不会生效。mv /www/server/nginx/sbin /www/server/nginx/sbinnginx.bak 备份原来的nginx命令 cp nginx /www/server/nginx/sbin/ 把tengine/objs目录中的nginx复制到/nginx/sbin/ 目录中 nginx -V 查看是否是新编译的nginx命令，需带--add-module=/usr/local/src/nginx-module-vts此参数 nginx -s stop 需要重启nginx，否则不生效，使用kill -USR2 `cat /var/run/nginx.pid`未生效，就被它折腾了一天， nginx 我的编译环境./configure --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/lua_nginx_module --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.42 --with-cc-opt=-Wno-error --add-module=/www/server/nginx/src/ngx-pagespeed --add-module=/www/server/nginx/redis2-nginx-module 参考https://zixuephp.net/article-460.htmlhttps://www.cnblogs.com/cyleon/p/10522872.html

如何在 ELB 访问日志中捕获客户端 IP 地址？
type: item
date: 2019-08-15T16:51:00+08:00
description: 问题我正在对我的 Web 服务器使用 Elastic Load Balancing，我可以在访问日志中看到我的负载均衡器的 IP 地址。如何改为捕获客户端 IP 地址？,我的环境是nginx具有 HTTP/HTTPS 侦听器的 Application Load Balancers 和 Classic Load Balancer (NGINX)在首选文本编辑器中打开 NGINX 配置文件。典型位置是 /etc/nginx/nginx.conf。在 LogFormat 部分中，添加 $http_x_forwarded_for，如下所示：http { ... log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; ... } 保存所做更改。如下所示重新加载 NGINX 配置文件。请务必使用适当的配置文件路径。nginx -s reload打开 NGINX 访问日志。位置因配置而异。验证客户端 IP 地址现在是否记录在 X-Forwarded-For 标头下。参考https://aws.amazon.com/cn/premiumsupport/knowledge-center/elb-capture-client-ip-addresses/

宝塔nginx自编译云锁web防护教程
type: item
date: 2019-07-24T09:27:00+08:00
description: 编译前先将已经安装的Nginx文件进行备份通过ps命令查看nginx文件的路径。以下所有步骤都以自身nginx路径为准ps -elf | grep nginx cd /www/server/nginx/sbin/ cp nginx nginx.bak 下载云锁防护模块压缩包 cd ~ wget https://codeload.github.com/yunsuo-open/nginx-plugin/zip/master -O nginx-plugin-master.zip 解压云锁防护模块压缩包nginx-plugin-master.zip unzip nginx-plugin-master.zip 获取当前云锁模块所在目录的全路径 cd nginx-plugin-master/ pwd 查看当前nginx加载的模块，在编译加载云锁防护模块的时候仍需加载这些模块 cd ~ /www/server/nginx/sbin/nginx -V 备注：将./configure arguents：之后的内容复制到记事本备用进入nginx源码目录，对nginx进行编译宝塔面板安装的nginx源码位于/www/server/nginx/src 编译时添加云锁防护模块参数，参数路径为第4步获取的云锁防护模块源码全路径“/root/nginx-plugin-master” 备注：编译内容为（./configure ’上一步记事本中的备用内容 --add-module=/root/nginx-plugin-master） cd /www/server/nginx/src ./configure --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-http_concat_module --with-ld-opt=-Wl,-E --with-jemalloc --without-http_upstream_session_sticky_module --add-module=/www/server/nginx/src/redis2-nginx-module-master Nginx1.8.0 以上和 Tengine 2.1.2 则需要修改objs/Makefile文件来支持post过滤在Makefile文件中的CFLAGS=…-Werror -g后追加宏定义 -DHIGHERTHAN8 vi objs/Makefile 备注：按Insert后找到-Werror -g 添加 -DHIGHERTHAN8 ，添加之后按ESC：wq make make完成后将系统中原有的nginx用重新编译生成的nginx文件替换，替换后重启nginx使新编译nginx生效到此通过PC端连接到服务器端，在PC端的界面上刷新后可以看到已识别nginx插件（由灰色变为绿色）。 rm -rf /www/server/nginx/sbin/nginx cp objs/nginx /www/server/nginx/sbin/ service nginx restart 到此通过PC端连接到服务器端，在PC端的界面上刷新后可以看到已识别nginx插件（由灰色变为绿色）。测试防护是否生效域名+/?order%20by 卸载使用nginx.bak文件替换掉自编译的nginx文件，替换后重启Nginx。以下nginx路径与上述安装路径一致，实际以自…

nginx 反向代理
type: item
date: 2018-07-24T10:01:00+08:00
description: 实现反向代理，访问a，到达bserver { listen 80; server_name user.looaon.com; location / { proxy_set_header Accept-Encoding ''; proxy_set_header Host $host:$server_port; proxy_pass http://117.160.132.162:666/; } } 参考2server { listen 80; server_name www.example.com; # 改为第一步申请的域名 location / { proxy_pass http://127.0.0.1:5050; } }

nginx 日志分析
type: item
date: 2018-06-13T01:15:00+08:00
description: 可以通过监控导出某一个时间节点的日志，分析ＵＲＬ流量大小，是否没走 cdn通过对 nginx 的 access.log 日志来简单分析 nginx 的实时流量， access.log 的日志格式要用 json 格式化输出修改 nginx 日志格式：log_format main '{"remote_addr":"$remote_addr","remote_user":"$remote_user","time_local":"$time_iso8601","request":"$request","status":"$status","body_bytes_sent":"$body_bytes_sent","http_referer":"$http_referer","http_user_agent":"$http_user_agent","http_x_forwarded_for":"$http_x_forwarded_for"}'; access_log /usr/local/nginx/logs/access/blog.log main; 运行脚本python nginx_netflow.py -f /var/nginx.log -n 100 tail后100行 python nginx_netflow.py 全部文件，超过100M tail最后10w行 脚本主要从日志中获取 body_bytes_sent 发送的包体大小，累加而成 #!/usr/bin/env python # set coding: utf-8 # description: nginx access log 下流量计算 根据send_body字段 以不同的request url来查询， # 流量越集中的请求，越需要优化 # usage: # python nginx_netflow.py 100 tail后100行 # python nginx_netflow.py 全部文件，超过100M tail最后10w行 # # todo: 输入ip地址，列出访问地址top N ； 可选输入 access.log路径 ； >10M 时输出kb # __author__ = "richardzgt" import os,sys import re from collections import defaultdict from optparse import OptionParser import time import linecache NGINX_FILE = '/var/nginx.log' FILE_MAX_SIZE = 100 # 100M 1024*1024*100 TOP_N = 5 # 打印前流量 5 LAST_LINE_NUM = 10000 REQUEST_WITH_Q = re.compile(r'(GET|POST)\s(\/\S+)\?') REQUEST_WITHOUT_Q = re.compile(r'(GET|POST)\s(\/\S+)') def exeTime(func): def newFunc(*args, **kwargs): t0 = time.time() print "@%s, {%s} start" % (time.strftime("%X", time.localtime()), func.__name__) back = func(*args, **kwargs) print "@%s, {%s} end" % (time.strftime("%X", time.localtime()), func.__name__) print "@%.3fs taken for {%s}" % (time.time() - t0, func.__name__) return back return newFunc def args_options(): parser = OptionParser() parser.add_option("-f", "--file", dest="file", action="store", help="input access.log directory") # parser.add_option("-s",dest="show",action="store_true",default=False, # help=u"show access.log") parser.add_option("-n",dest="nums",action="store", help="tail the access log file，default is [%s]" % LAST_LINE_NUM) re…

nginx upsteam 分配方式
type: item
date: 2018-06-13T01:11:46+08:00
description: 基于域名upstream apache_cluster{ dynamic_resolve fallback=stale fail_timeout=3s; server 1-1.host :8080 } upstream 负载均衡 轮询upstream apache_cluster{ server 10.0.0.1:8080 ; server 10.0.0.2:8080 ; } weight 权重用于后端服务器优劣的场景upstream apache_cluster{ server 10.0.0.1:8080 weight=2; server 10.0.0.2:8080 weight=3; server 10.0.0.2:8080 weight=5; } ip_hash每个访客会固定访问一个后端服务器，可以解决 session 一致问题 upstream backend { ip_hash; server 10.0.0.1:8080 ; server 10.0.0.2:8080 ; } fair（第三方）按后端服务器的响应时间来分配请求，响应时间短的优先分配。 url_hash（第三方）使每个 url 定向到同一个后端服务器，后端服务器为缓存服务器时比较有效。状态检测upstream apache_cluster{ server 10.0.0.1:8080 max_fails=3 fail_timeout=30; server 10.0.0.2:8080 max_fails=3 fail_timeout=30; } 1.max_fails 和 fail_timeout 一般会关联使用2.max_fails 默认１, 当超过最大次数时，返回 proxy_next_upstream 模块定义的错误,3.fail_timeout:max_fails 次失败后暂停的时间设置为 0，则表示取消这项检查; 当 upstream 中只有一个 server 时，max_fails 和 fail_timeout 参数可能不会起作用backupbackup： 其它所有的非 backup 机器 down 或者忙的时候，请求 backup 机器。所以这台机器压力会最轻。upstream apache_cluster{ server 10.0.0.1:8080 max_fails=3 fail_timeout=30s; server 10.0.0.2:8080 backup; } keepalivekeepalive tomcat 官方默认推荐最大值是 200nginx_upstream_check_module淘宝技术团队开发的 nginx 模快, 检测后方 realserver 的健康状态，如果后端服务器不可用，则所以的请求不转发到这台服务器。upstream linuxyan { server 192.168.0.21:80; server 192.168.0.22:80; check interval=3000 rise=2 fall=5 timeout=1000; } 模块地址：https://github.com/yaoweibin/nginx_upstream_check_modulerealserver状态的页面location /nstatus { check_status; access_log off; #allow SOME.IP.ADD.RESS; #deny all; }

Nginx下常见报错
type: item
date: 2018-05-25T14:11:00+08:00
description: 路径下找不到nginx.pidnginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) 解决方法执行一下nginx/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

web 优化大事项（nginx）
type: item
date: 2018-05-03T09:34:00+08:00
description: Nginx 优化大概事项> 1.Gzip 压缩优化 > 2.expires 缓存优化 > 3.网络io事件模型优化（epoll模型） > 4.隐藏软件名称和版本号 > 5.防盗链优化 > 6.禁止恶意域名解析 > 7.禁止通过ip地址访问网站（可选） > 8.http请求方法优化 > 9.防DOS攻击单ip并发连接的控制，与连接速率控制 > 10.严格设置管理web站点目录的权限 > 11.将nginx进程以及站点运行于监牢模式 > 12.404友好或带提示的错误页面 > 13.通过robot技术以及Http_USER_AGENT防爬虫优化 > 14.nginx日志访问优化（轮询切割，不记录元素日志，最小化目录权限等） > 15.限制上传到资源目录的程序访问，防止木马入侵系统破环系统 > 16.fastcgi参数（buffer cache）配置文件的优化 17php.ini和php-fpm.conf配置文件的优化（16-17针对php） > 18.有关web服务的linux内核方面深度优化（网络连接，io，内存等） > 19.nginx 加密传输优化（ssl） > 20.web 服务器磁盘挂载及网络文件系统的优化 （18 20针对linux系统优化） 21使用nginx cache（NOSQL技术） > 22.nginx WAF技术 > 23.cdn加速技术（蓝汛，icloud）