nginx常用功能,网站、反向代理、四层代理、优化方法、python动态页面解析。

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. 优化 n g i n x 并发量

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,来支持超长 地址。即4 1 4 错误 如何 解决 ,请求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 . 防do s 攻击

配置nginx连接共享内存为10M,每秒钟只接收一个请求,最多有5个请求排队,多余的拒绝

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; # 添加

limit_req zone=one burst=5; # 添加

1 0 . 防止 缓冲区 溢出

http {

client_body_buffer_size 1k;

client_header_buffer_size 1k;

client_max_body_size 1k;

large_client_header_buffers 2 1k;

p y t h o n 动态 页面 解析 u W S G I

python用Django框架

1 . 自己 一个 i ni 配置 文件

]# 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 . 修改 n g inx 配置 文件 添加 两行

location / {

uwsgi_pass 127.0.0.1:8000; # 默认location里面添加转发后端

include uwsgi_params; # 默认location添加,此文件nginx自带

root html;

index index.html index.htm;

}

3 . i n i 文件 运行 项目

]# uwsgi --ini myproject.ini

补充说明:

  1. server在nginx配置文件里面有两层含义,一层是虚拟主机,另一层,包含在upstream xxx块之中的是后端真实服务器。

  2. http块内是七层的内容,也就是网站相关的。四层的内容要写在http块之外,比如四层代理。

  3. location写在server块里面,也就是一个虚拟主机里面的不同路径给到不同的网站的根目录,和默认首页。用来匹配客户端访问的网站的路径。

  4. proxy_pass调用后端,可以写在server里面,也可以细分到server的location里面。

  5. nginx调优的目的是为了发挥它的最大实力。

相关推荐
cocologin8 分钟前
RIP 技术深度解析
运维·网络·网络协议
庸子25 分钟前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
眠修1 小时前
Kuberrnetes 服务发布
linux·运维·服务器
好奇的菜鸟2 小时前
Docker 配置项详解与示例
运维·docker·容器
xcs194052 小时前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany2 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿3 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing3 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构
鳄鱼皮坡3 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛4 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos