nginx2
nginx
nginx代理
正向代理在客户端
反向代理在服务端
proxy常见配置
[root@Nginx ~]# vim /etc/nginx/proxy_params
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
//具体location实现
location / {
proxy_pass http://127.0.0.1:8080;
include proxy_params;
}
upstream负载均衡
提升吞吐率, 提升请求性能, 提高容灾
upstream name {
server ...
server ...
}
负载均衡状态
负载均衡的调度策略
负载均衡tcp配置(四层代理)
# stream不在http标签,所以在主配置文件中配置/etc/nginx/nginx.conf
#注意要在http标签外面加上如下几行
stream {
include /etc/nginx/stream_conf.d/*.conf;
}
动静分离
# 动静分离
upstream static {
server 10.1.106.66:80;
}
upstream java {
server 10.1.106.66:8090;
}
server {
listen 80;
server_name upstream.top;
root /soft/code/access/ ;
location / {
root /soft/code/access/;
index index.html;
}
location ~ .*\.(png|jpg|gif)$ {
proxy_pass http://static;
include proxy_params;
}
location ~ .*\.jsp$ {
proxy_pass http://java;
include proxy_params;
}
}
# 不同应用访问
upstream pc {
server 172.16.1.7:80;
}
upstream iphone {
server 172.16.1.8:80;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_set_header Host $Http_host;
# 判断如果来源是手机则调度到phone集群组
if ($http_user_agent ~* "iphone|android|ipad" ) {
proxy_pass http://iphone;
}
if ($http_user_agent ~* "firefox|MSIE|Chrome|Trident") {
return 200 'Please Change Browser.....';
}
# 如果来源不是手机,则调度到pc集群组
proxy_pass http://pc;
}
}
nginx缓存
proxy_cache缓存配置
proxy_cache_path # 缓存路径
proxy_cache_valid # 缓存过期周期
proxy_cache_key # 缓存维度
upstream cache {
server 10.1.106.66:8081;
server 10.1.106.66:8082;
server 10.1.106.66:8083;
}
#proxy_cache存放缓存临时⽂件
#levels 按照两层⽬录分级
#keys_zone 开辟空间名, 10m:开辟空间⼤⼩, 1m可存放8000key
#max_size 控制最⼤⼤⼩, 超过后Nginx会启⽤淘汰规则
#inactive 60分钟没有被访问缓存会被清理
#use_temp_path 临时⽂件, 会影响性能, 建议关闭
proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m max_size=10g
inactive=60m use_temp_path=off;
server {
listen 80;
server_name cache.wingsredevsecops.top;
# 部分页面不缓存
if ($request_uri ~ ^/(url3|login|register|password)) {
set $cookie_nocache 1;
}
#proxy_cache 开启缓存
#proxy_cache_valid 状态码200|304的过期为12h, 其余状态码10分钟过期
#proxy_cache_key 缓存key
#add_header 增加头信息, 观察客户端respoce是否命中
#proxy_next_upstream 出现502-504或错误, 会跳过此台服务器访问下台
location / {
proxy_pass http://cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache code_cache;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502
http_503 http_504;
include proxy_params;
}
}
缓存清理
# 方法1:清除缓存数据
# 方法2:通过 ngx_cache_purge 扩展模块清理, 需要编译安装 Nginx
缓存日志统计
//修改/etc/nginx/nginx.conf中log_format格式
log_format main '$http_user_agent' '$request_uri' '$remote_addr - $remote_user
[$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$upstream_cache_status"';
//修改proxy_cache.conf, 在server标签新增access⽇志
access_log /var/log/nginx/proxy_cache.log main;
//使⽤curl访问, 最后检查⽇志命令情况
curl/7.29.0/url3.html192.168.56.183 - - [19/Apr/2018:11:48:43 -0400] "HEAD /url3.html
HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""MISS"
curl/7.29.0/url2.html192.168.56.183 - - [19/Apr/2018:11:48:45 -0400] "HEAD /url2.html
HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""HIT"
curl/7.29.0/url2.html192.168.56.183 - - [19/Apr/2018:11:48:46 -0400] "HEAD /url2.html
HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""HIT
rewrite
实现url地址重写,以及重定向
rewrite 匹配规则 url地址 标记;
rewrite标记flag
# rewrite匹配优先级
1.执⾏server块的rewrite指令
2.执⾏location匹配
3.执⾏选定的location中的rewrite
HTTPS
Syntax: ssl on | off;
Default: ssl off;
Context: http, server
Syntax: ssl_certificate file;
Default: —
Context: http, server
Syntax: ssl_certificate_key file;
Default: —
Context: http, server
# 环境
openssl version # openssl是1.0.2
nginx -V # nginx有 --with-http_ssl_module
# 创建目录、创建私钥、生成证书
mkdir /etc/nginx/ssl_key -p
openssl genrsa -idea -out server.key 2048
openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
LNMP动态网站
安装php、mariadb
# 配置
location ~ \.php$ {
#root /data/blog;
fastcgi_pass 127.0.0.1:9000; # 将请求转给9000端口的应用程序处理
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 告诉php需要被解析的文件在哪个目录,是哪个文件
include fastcgi_params;
}
# 测试
vim test_php.php
<?php
phpinfo();
?>
php配置文件优化
# php-ini优化
sql.safe_mode = Off
expose_php = Off
display_error = Off
error_reporting = E_WARNING & E_ERROR
log_errors = On
error_log = /var/log/php_error.log
upload_max_filesize = 50M
allow_url_fopen = Off
date.timezone = Asia/Shanghai
# php-fpm优化
# /etc/php-fpm.d/www.conf错误日志,慢查询优化,用户
# php-www模块错误⽇志
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php/php-www.log
php_admin_flag[log_errors] = on
#php慢查询⽇志
request_slowlog_timeout = 5s
slowlog = /var/log/php/php-slow.log
LNMT架构
# 安装jdk
#上传到 /soft/package/
[root@tomcat-node1-20 package]# pwd
/soft/package/
[root@tomcat-node1-20 package]# ll
-rw------- 1 root root 194151339 4⽉ 28 21:20 jdk-8u231-linux-x64.tar.gz
[root@tomcat-node1-20 package]# tar xf jdk-8u231-linux-x64.tar.gz -C /app
[root@tomcat-node1-20 ~]# cd /app/ && mv jdk1.8.0_231 jdk1.8
[root@tomcat-node1-20 ~]#cat /etc/profile.d/jdk.sh
export JAVA_HOME=/app/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
[root@tomcat-node1-20 ~]# chmod +x /etc/profile.d/jdk.sh
[root@tomcat-node1-20 ~]# source /etc/profile
[root@tomcat-node1-20 ~]# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
# 安装tomcat
[root@tomcat-node1-20 ~]# mkdir /soft/src -p
[root@tomcat-node1-20 ~]# cd /soft/src
[root@nginx ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-
9/v9.0.74/bin/apache-tomcat-9.0.74.tar.gz --no-check-certificate
[root@tomcat-node1-20 src]# tar xf apache-tomcat-9.0.74.tar.gz -C /soft
[root@tomcat-node1-20 src]# cd ..
[root@tomcat-node1-20 soft]# mv apache-tomcat-9.0.74/ tomcat-8080
[root@tomcat-node1-20 bin]# /soft/tomcat-8080/bin/startup.sh
jvm故障排查思路
1. jps获取java进程的PID
2. top -H -p PID 查看对应进程的哪个线程占⽤CPU过⾼。
3. jstack pid >> java.txt 导出CPU占⽤⾼进程的线程栈。
4. echo "obase=16;989"|bc 将线程的PID转换为16进制。
5. 在第⼆步导出的java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。
6. .分析负载⾼的线程栈都是什么业务操作。优化程序并处理问题。
tomcat性能优化
#最⼤线程数
maxThreads="600"
#初始化时创建的线程数
minSpareThreads="100"
#⼀旦创建的线程超过这个值,Tomcat就会关闭,不再需要的socket线程。
maxSpareHtreads="500"
#指定当所有可以使⽤的处理请求的线程数量都被使⽤时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
acceptCount="700" />
jstack
jstack 是 JDK ⾃带的⼀个命令⾏⼯具,可以⽤来打印出⼀个 Java 进程的线程堆栈信息。
# 语法
jstack [-l] [-m] [-h] [-F] [-v] <pid or core>
-l : 输出关于锁的附加信息
-m : 如果调⽤本地⽅法,则显示C/C++堆栈信息
-h : 帮助信息
-F : 当正常输出阻塞时,强制输出线程的堆栈信息
-v : 输出所有JVM相关信息
nginx+lua
lua
# 安装
yum install lua -y
# 交互式输入lua,命令行输出
# 非交互式 lua 脚本
默认情况下 Nginx 不⽀持 Lua 模块, 需要安装 LuaJIT 解释器, 并且需要重新编译 Nginx
Nginx调⽤Lua指令
# 语法
set_by_lua set_by_lua_file # 设置Nginx变量,可以实现负载的赋值逻辑
# set_by_lua 通过 inline Lua 代码设置变量的值,set_by_lua_file 则可以通过引⼊ Lua 脚本⽂件来设置变量。这两个模块通常⽤于实现负载的赋值逻辑,如根据请求的 headers 头部信息等进⾏动态变量设置。
access_by_lua access_by_lua_file # 请求访问阶段处理, ⽤于访问控制(鉴权转发)
content_by_lua content_by_lua_file # 内容处理器, 接受请求处理并输出响应
实现代码灰度发布
通过内嵌的lua模块解析nginx配置文件中lua脚本,lua脚本获取客户ip,查看memcache缓存中是否存在该键值,实现请求转发
实现waf应用防火墙
nginx性能优化
安全: 隐藏版本号 加密传输 csof 防盗链 refere 限制上传类型 访问控制acess waf 等
性能: 硬件 Epool 连接数 max gzip 压缩 expire sendfile 零拷贝
nginx常见问题
优先级
server优先级根据加载顺序(/etc/nginx/conf.d/)
location优先级:
# 匹配符 匹配规则 优先级
# = 精确匹配 1
# ^~ 以某个字符串开头 2
# ~ 区分大小写的正则匹配 3
# ~* 不区分大小写的正则匹配 4
# / 通用匹配,任何请求都会匹配到 5
try_files
第一个url没找到,找第二个url
alias和root的区别
alias站点的别名
获取用户真实ip
$remote_addr 只能获取到最近⼀台服务器访问IP
x_forwarded_for 头部信息容易被篡改x_forwarded_for
常见http状态码
nginx优化方案
Nginx优化
#安全
1.隐藏Nginx名称和版本号
2.Nginx加密传输优化
3.配置防盗链,防⽌资源被盗⽤
#访问控制
4.防DDOS、cc攻击, 限制单IP并发请求连接
5.禁⽌通过IP地址访问,禁⽌恶意域名解析,只允许域名访问
6.限制上传资源⽬录被程序访问,防⽌⽊⻢⼊侵系统
#性能
1.gzip压缩
2.expires静态⽂件缓存
3.调整⽹络IO模型,调整Nginx worker进程的最⼤连接数
4.配置错误⻚⾯,根据错误代码指定⽹⻚反馈⽤户

浙公网安备 33010602011771号