nginx的常用功能:
一、网站功能
nginx配置文件的语法:
指令 参数 分号结尾
1. 用户认证
auth_basic "xxx" ;
auth_basic_user-file "/path/for/pass" ;
htpasswd -c /path/for/pass username1
htpasswd /path/for/pass username2
2. 基于端口的虚拟主机
http{
server {
listen 8000 ; # 监听端口号
server_name __; # 虚拟主机域名
root html_a # 网页文件根目录
index index.html # 默认页
}
server {
listen 8080 ;
server_name __;
root html_b;
index index.html;
}
}
3. 安全加密网站
openssl genrsa 生成私钥
openssl req -x509 -key 请求生成公钥(根据私钥),公钥也叫证书
公钥相当于锁
私钥相当于钥匙
4. lnmp动态网站
nginx默认不支持动态网站
需要与php和数据库结合,可以支持
l: linux
n: nginx
m: mariadb数据库客户端
mariadb-server数据库服务端
mariadb-devel扩展包
因为在本机部署,属于既是客户端,又是服务端
p: php动态网站的语言工具,但不能自动解析,所以需要php-fpm
php-fpm 解析(翻译)php的动态页面
php-mysqlnd 网站跑起来是需要存数据的,安装之后程序可以自动调用数据库
配置的核心就是修改两个文件:
一个是php-fpm的配置文件/etc/php-fpm.d/www.conf
第38行下方添加一行:listen 127.0.0.1:9000
第二个是nginx的配置文件,把location ~ /.php$ 这个块放开
5. 地址重写
rewrite /a.html /b.html; # 访问包含a.html的路径时,跳转到b.html,其中a.html可以不存在,b.html要存在
rewrite ^/a\.html$ /b.html; # 严格匹配a.html,^匹配开头,\转义符,$匹配结尾
rewrite ^/a\.html$ /b.html redirect/permanent;
# redirect临时重定向,浏览器地址栏会变为b.html,状态码302;permanent永久重定向,状态码301
指令 参数1 参数2 选项
rewrite /(.*) http://www.example.com/$1; # 跳转到新域名的相同路径
比如访问192.168.1.3/a.html,就会跳转到http://www.example.com/a.html
适用于企业换域名了的场景
if ($http_user_agent ~* firefox) { # “~”正则匹配,“*”忽略大小写
rewrite (.*) /firefox/$1;
} # 根据用户的浏览器代理,推送不同的页面
location是为了匹配用户的路径,如果访问什么路径,就提供什么服务
location的作用,有点像if判断
二、反向代理(网站集群)
不亲自提供服务,指挥后端服务器服务,
搭建集群的目的是负载均衡
反向代理、调度器、代理服务器,都是一个意思
是为后端服务器服务的,服务什么呢,就是帮他们合理的分配任务,所以对于客户端来讲,是反向代理服务器。正向代理服务器,是给客户提供服务的,比如说代理访问一些链路太远的服务器,比如云服务商的镜像加速站等。把链路太远,不容易直接访问到的资源缓存到代理服务器,然后客户端访问这些资源比较快。对于客户端来讲,就是正向代理。
1. 权重
http {
upstream webserver {
server 192.168.1.2 weight=2; # 权重
server 192.168.1.3 weight=1; # 权重
}
server {
listen 80;
server_name __;
location / {
proxy_pass http://webserver;
root html;
index index.html;
}
}
}
默认分配任务的策略是轮询
2. 健康检查
upstream webserver {
server 192.168.99.22:80 ;
server 192.168.99.33:80 max_fails=2 fail_timeout=30;
} # 检测2次失败,认为后端服务器休息;然后每30秒检测一次是否已上线。
upstream webserver {
server 192.168.99.22:80;
server 192.168.99.33:80;
server 192.168.99.44:80;
...
server 192.168.99.99:80;
server 127.0.0.1:80 default max_fails=2 fail_timeout=30;
} # 声明健康检查适用于后端所有服务器。
3. 相同客户访问相同服务器
upstream webserver {
ip_hash; # 相同客户访问相同服务器,主要用于用户重复登录的问题
# 根据hash算法,同ip哈希值的用户访问,给同一个后端服务器
server 192.168.99.22:80 ;
server 192.168.99.33:80 ;
}
4. 暂时不参与集群活动
upstream webserver {
server 192.168.99.22:80 down; # 此机器暂时不参与集群活动,先去支持其他业务
server 192.168.99.33:80 ;
}
三、四层代理(tcp/udp代理)
四层代理和七层代理的区别,四层代理是写在http块的外面,用的stream{ upstream
七层直接用的upstream,写在http里面,upstream是用来创建集群的,
如果玩四层,就是在http外面,stream里面创建集群,
如果是玩七层,就是在http里面,直接写upstream
总之,两个都要用到upstream
区别是,四层要包在stream里面,七层直接包在http里面
如果企业运行的不是网站业务,比如ftp、dns,这些服务都是能在服务器上运行。
这个功能模块默认没有安装,--with-stream
然后无论是七层还是四层,找后端,都是在server里面定义一个proxy_pass 指令
参数是这个集群的名称
集群里面的主机用server ip ;定义
因为四层代理和http没有关系,所以要写在http的外面
举例ssh集群,这个跟网站没有关系,所以需要写在http块之外
用四层代理,要安装--with-stream模块,用这个模块来实现四层代理的功能
proxy_pass 指令是调用集群
stream {
upstream backend {
server 192.168.99.22:22;
server 192.168.99.33:22;
}
server {
listen 12345;
proxy_pass backend;
}
}
http {
server {
location / {
}
}
}
测试:
ssh 192.168.99.11 -p 12345 # 99.11就会把ssh请求转发给后端TCP服务器
四、优化
1. 自定义错误页面,且开启中文
开启中文:
charset utf-8;
自定义错误页面,取消注释行:
error_page 404 /404.html;
echo "抱歉,您访问的网页不存在" > html/404.html
nginx配置文件里面的根“/”是网站的根,而不是linux的根
2. 查看后台数据的功能
需要nginx的另外一个模块
--with-http_stub_status_module
# stub 票据存根,这里意思是http存根状态
# 核心词status,记不住模块名,可以
./configure --help | grep status
同理,可以
./configure --help | grep ssl
找到https网站需要用的http_ssl模块
如果原来运行的nginx没有安装--with-http_stub_status_module
用./configure --with-stream --with-http_stub_status_module && make
生成objs/nginx,这个新的nginx主程序
通过objs/nginx -V 可验证新的结果
cp objs/nginx /usr/local/nginx/sbin/nginx
把原来的主程序覆盖,新功能模块就可以用了
而/usr/local/nginx/目录下的其他数据都没动
等于说是make,重新配置编译主程序,然后把新主程序拷贝到安装目录,程序就升级了
拷贝前停止nginx服务就行,不用卸载重装。
相当于给服务打补丁,而不是重新安装。
操作方法:
location /status {
stub_status on; # 启动状态页面
allow example_ip; # 允许自己的ip
deny all; # 拒绝别的ip访问这个路径
}
网站访问后台数据,只允许自己看,其他人不能看。
PV 页面浏览量
UV 独立访客数
默认server里面加一个location,匹配网站根目录下的/status路径,
访问网站这个路径,可以看到stub_status,网站的存根状态
状态页解释:
Active connections: 活动连接数,有多少用户正在访问此网站,比较真实体现网站的访问量
server accepts handled requests
已经接收客户端的连接总数量
已经处理客户端的连接总数据
客户端发送的请求数据
Reading: Writing: Waiting:
服务器正在读取客户端请求头的数量,用户特别多的时候,这个值会增加
当前服务器正在回应数据的数量
多少用户正在等待服务器响应
这些数据能很好的展示,服务器的运行情况,如果访问量大,但是等待的用户太多,那么就需要给服务器加配置,优化性能。
3. 优化nginx并发量
worker_processes x; # nginx启动之后,开多少干活的进程,一般设置为等于cpu核心数
多少个核心开多少个进程
events {
worker_connections xxxx; # 每个nginx进程,支持的并发量,这个值可以设置大一些
}
命令行: ulimit -n 查看本机器支持的最大打开文件数量,默认是1024
ulimit -n 100000 将本机最大打开文件数调整为100000,用来ab测试,实践中不用调整
ab -n -c http://192.168.xx.xx 压力测试
4. 优化nginx,来支持超长地址。即414错误如何解决,请求url头部太长
client_header_buffer_size 200k;
large_client_header_buffers 4 200k;
http块里面添加这两行命令参数
网页地址允许开发使用问号?传递变量参数
这个变量参数不需要人来定义,这个地址由程序自动生成
解决nginx如何支持超长地址的问题
nginx会先缓存数据,然后读取这个缓存
nginx保存客户端的请求数据时,默认缓存数据的量是1k
如果有的请求头数据超过1k,就需要优化
5. 让客户端浏览器,缓存本地数据
不用客户端点一次,服务器就发送一次数据,大大减轻服务器的压力
服务器可以让客户端的浏览器和app缓存服务器刚刚传递过来的数据
location ~* \.(jpg|html|mp4|txt)$ {
expires 30d;
}
# “~”允许用正则表达式匹配,“*”忽略大小写,“\”转义符, “.jpg$” 以.jpg结尾
# expires 30d; # 等30天过后,这个文件才过期,让数据在客户浏览器缓存30天
6. 配置网站限流限速
limit_rate 100k; #全局限速
limit_rate 200k; #虚拟主机限速
limit_rate 300k; #file_a目录限速300k
limit_rate 0k; #file_b目录不限速
limit_conn_zone $binary_remote_addr zone=addr:10m; # 一个用户同时打开多个连接也无法突破限制
7. 跨域访问
add_header 'Access-Control-Allow-Origin' 'http://192.168.1.2'; # #服务器响应数据中添加允许跨域访问
8. 隐藏版本号
server_tokens off;
9. 防dos攻击
配置nginx连接共享内存为10M,每秒钟只接收一个请求,最多有5个请求排队,多余的拒绝
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; # 添加
limit_req zone=one burst=5; # 添加
10. 防止缓冲区溢出
http {
client_body_buffer_size 1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
五、python动态页面解析,uWSGI
python用Django框架
1. 自己写一个ini配置文件
]# cat myproject.ini
[uwsgi]
socket=127.0.0.1:8000
chdir=/root/python/python-project
wsgi-file=path/wsgi.py
daemonize=/var/log/uwsgi.log
processes=4
master=true
2. 修改nginx配置文件,添加两行
location / {
uwsgi_pass 127.0.0.1:8000; # 默认location里面添加转发后端
include uwsgi_params; # 默认location添加,此文件nginx自带
root html;
index index.html index.htm;
}
3. 用ini文件运行项目
]# uwsgi --ini myproject.ini
补充说明:
1. server在nginx配置文件里面有两层含义,一层是虚拟主机,另一层,包含在upstream xxx块之中的是后端真实服务器。
2. http块内是七层的内容,也就是网站相关的。四层的内容要写在http块之外,比如四层代理。
3. location写在server块里面,也就是一个虚拟主机里面的不同路径给到不同的网站的根目录,和默认首页。用来匹配客户端访问的网站的路径。
4. proxy_pass调用后端,可以写在server里面,也可以细分到server的location里面。
5. nginx调优的目的是为了发挥它的最大实力。