开机自启在/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，先在配置文件里配上日志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
先下载模块，我是下载在 /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 地址？
问题我正在对我的 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文件进行备份通过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路径为准。 cd /www/server/nginx/sbin/ rm -rf nginx mv nginx.bak nginx service nginx restart
实现反向代理，访问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; } }
可以通过监控导出某一个时间节点的日志，分析ＵＲＬ流量大小，是否没走 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) return parser def group_by(group_dict,group_str,body_bytes_sent): if group_dict.get(group_str): group_dict[group_str]['sum_bytes'] += body_bytes_sent group_dict[group_str]['count'] += 1 else: group_dict[group_str] = {'sum_bytes': body_bytes_sent,'count':1} return group_dict # return group_dict def order_bytes(group_dict): return sorted(group_dict, key=lambda name: group_dict[name]['sum_bytes'], reverse=-1) def print_order(get_group_type,get_order_btyes): print("%s" % ('=='*10)) for index,each in enumerate(get_order_btyes): if index >= TOP_N: break sum_bytes = get_group_type.get(each).get('sum_bytes') count = get_group_type.get(each).get('count') print("%s match %s times,bring \033[1;31;m %0.fMB \033[0m" % (each,count,sum_bytes/1024/1024)) def request_url(url): if url.find('?') > 0: regex = REQUEST_WITH_Q.match(url) else: regex = REQUEST_WITHOUT_Q.match(url) if regex is not None: return regex.groups()[1] return 'NONE_REGEX_CONTENT' # @exeTime def all_file_handle(file_obj): group_by_ip = defaultdict(list) group_by_request = defaultdict(list) group_by_action = defaultdict(list) group_by_server_name = defaultdict(list) total_bytes = 0 start_time = "" for eachline in file_obj: try: data = eval(eachline) if not start_time: start_time = data['time_local'] body_bytes_sent = int(data['body_bytes_sent']) total_bytes += body_bytes_sent group_by(group_by_ip,data['remote_addr'],body_bytes_sent) group_by(group_by_request,request_url(data['request']),body_bytes_sent) group_by(group_by_server_name,data['server_name'],body_bytes_sent) except TypeError as e: continue for each_group in (group_by_ip,group_by_request,group_by_server_name): get_order_bytes = order_bytes(each_group) print_order(each_group,get_order_bytes) print("first line start: %s" % (start_time)) print("total: %0.1f MB" % (total_bytes/1024/1024)) def echo_color(content): print("\033[;1m%s\033[0m" % content) def main(nums=0): try: file_obj = open(NGINX_FILE,'r') except IOError: echo_color("not found file") sys.exit() if nums != 0 : handle_file = linecache.getlines(NGINX_FILE)[-nums:] elif os.stat(NGINX_FILE).st_size < FILE_MAX_SIZE*1024*1024: handle_file = file_obj else: print('too big,use limit row num,default is %s' % LAST_LINE_NUM) handle_file = linecache.getlines(NGINX_FILE)[-LAST_LINE_NUM:] all_file_handle(handle_file) if __name__ == '__main__': parser = args_options() (options, args) = parser.parse_args() if options.file: NGINX_FILE=options.file if options.nums: nums = options.nums if nums.isdigit(): nums = int(nums) main(nums) else: print("not get lines num") else: main()
基于域名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.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
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）