nginx偏运维, 不过作为开发应该了解它能做什么事情, 其作为技术架构的一部分必不可少

正向代理和反向代理

正向代理是代理的客户端, 反向代理是代理的服务端. nginx就是一款可以作反向代理的web服务器.

常见的Web服务器

Apache, Nginx,Tomcat,WebLogic, iis, jetty, undertowe, resin

Apache,Nginx 是同一类型的服务器, 都可以提供反向代理功能.

web服务器按提供的内容可以划分为动态web服务器和静态web服务器, 静态web服务器提供静态的文件内容, 比如html,css,js,image等, 动态web服务器提供动态内容, 如jsp,asp等经过服务器程序运行输出的页面.

Nginx的安装

  • tar -zxvf 安装包
  • ./configure --prefix=/user/nginx 没有则默认安装到/user/local/nginx
  • 如果报缺少pcre包, 需要安装sudo apt-get install libpcre3 libpcre3-dev
  • 如果缺少zlib包, 需要安装sudo apt-get install zlib1g-dev
  • make 以及 make install

命令

  • 启动: ./nginx -c /user/data/nginx/conf/nginx.conf -c 表示指定nginx.conf文件, 默认为NGINX-HOME/conf/nginx.conf
  • 命令方式停止:

    ./nginx -s stop

    ./nginx -s quit

    ./nginx -s reload
  • 发送信号的方式停止:

    kill -QUIT pid pid是进程号. 安全停止, 可以使正在处理的停止

    kill -TERM pid

进程模型

多进程模型: 主进程fork出一个进程处理请求.nginx的方式.

多线程模型: 可能有并发问题

异步方式: 每个进程采用异步非阻塞模型处理请求.

配置

主要分三部分:

  • main
work_processes 2; //工作进程数, 一般为cpu核数
work_cpu_affinity 01 10
error_log /var/log/nginx/error.log warn; //错误日志
worker_rlimit_nofile 10240; // 最大打开文件数
  • event
event{
use epoll ; // 选项有 select poll epoll kqueue等
work_connections 10240; //连接数
accept_mutex off; //off 可以提高效率
} http{
include mime.types;
default_type application/octet-stream; //默认mime
charset utf-8;
access_log off;
sendfile on;
gzip on;
....
proxy_temp_path /data/
proxy_cache_path /data/cache; level=1:2
inclued /etc/nginx/conf.d/*.conf;
}
  • server

虚拟主机

  • 基于域名

下面配置一个虚拟主机:

server{
listen 80;
server_name www.my.com;
location / {
root html/domain;
index index.html index.htm;
}
}
  • 基于IP
  • 基于端口
server{
listen 8080;
server_name localhost;
location / {
root html/domain;
index index.html index.htm;
}
}

nginx日志配置

log_format formatName '.....' //日志格式
access_log logs/logfile.log formatName //指定日志路径和格式

日志切割

mv access.log access.log.001 然后重启生成, 可以写个运维脚本, 定时执行

location 的语法和匹配规则

= 是精确匹配, 如=/mypage.html 优先级最高(类似servlet规范的url的优先级规则)

一般匹配, 优先级高于正则匹配, 如:/myroot/mydir/mypage/

正则匹配, 如^~ /prefix/my/jsp

location[~|=|^~|~*]/uri{

}

rewrite 使用

使用 rewrite 支持 url 重写. 支持 if,return语句.

只能在server/location/if中使用. 只能对域名后除去参数外的字符串起作用.

if(条件){}: 条件可以是 = 或者 ~ 后者表示一个正则, 如if($request_uri~*\.sh){ return 403; } 表示如果请求是.sh结尾的, 则返回403.

rewrite的语法

rewrite regex replacement[flag]{last/break/redirect/permant}

last 停止处理后续的rewrite 指令集, 然后对当前重写的uri在 rewrite 指令集上重新查找; break则不会重新查找;

//重定向到百度
location / {
rewrite ^/ http://www.baidu.com ;
}
location / {
rewrite '^/images/([a-z]{3})/(.*)\.(png)$' /images?file=$2.$3 ;
set $image_file $2;
set $image_type $3;
}
loation /images {
root html;
try_files /$arg_file /image404.html;
}
location =/image404.html{
return 404 "image not found";
}

浏览器本地缓存

expires 60s s|m|h|d 可用的时间单位

server{
listen 80;
server_name localhost;
location /{
root html;
index index.html index.htm
}
location ~ \.(png|jpg|js|css|gif)${
root html/images;
expires 60s
}
}

Gzip 压缩

server{
...
gzip on;
gzip_buffers 4 16k //16k为单位, 4倍申请
gzip_comp_level 4; //0-9
gzip_min_length 500; //最小压缩大小,小于此大小不压缩
gzip_types text/css; //压缩的mime类型
...
}

反向代理

为了方便单独配置, 新增 proxy.conf 然后在主文件中的http节点添加include /path/proxy.conf 当然也可以直接修改nginx.conf

location =/s {
proxt_set_header Host $host
proxt_set_header X-Real_IP $remote_addr // 设置请求的真实ip
proxy_set_header interface_version $Host //版本号
proxy_pass http://www.baidu.com;
}

负载均衡

upstream tomcatserver{
ip_hash; // 也可以不配置,不配置则轮训策略, 或者配置为fair(按响应时间),utl_hash
server 192.168.1.122:8080;
server 192.168.1.123:8080 weight=4; //如果是轮训, 则权重起作用
} // 修改proxy_pass节点为负载均衡
prox_pass http://tomcatserver

配置https

生成证书:

  • openssl genrsa -des3 -out server.key 1024
  • openssl req -new -key server.key -out server.csr
  • cp server.key server.key.org
  • openssl rsa -in server.key.org -out server.key
  • openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

配置:

server{
listen 443;
server_name www.myhost.com;
ssl on;
ssl_certificate /my/host/conf/server.crt;
ssl_certificate_key /my/host/conf/server.key;
location / {
proxy_pass http://myhost;
}
}

修改tomcat配置(最后两个配置新增): 这个可以不配置, 走http

<Connector port="8080" protocal="HTTP/1.1" connectionTimeout="20000"
proxyPort="443" redirectPort="443" />

nginx+keepalived (相当于nginx主从)

基于 VRRP(虚拟路由器冗余协议);

  • 下载解压keepalived包
  • 配置./configure --prefix=/mydir/keepalived/ --sysconf=/etc 最后一个参数是表明把配置文件存储到指定目录下
  • make & make install
  • ln -s /.../sbin/keepalived /sbin
  • cp /etc/init.d/keepalived /etc/init.d/
  • chkconfig --add keepalived
  • chkconfig keeepalived on

修改keepalived.conf文件

vrrp_instance_VI_1{
state MASTER // 另一台为BACKUP
interface eth0 //网卡端口, ifconfig后修改为正确端口
virtual_router_id 51 //主从保持一致
priority 100 //master必须大于backup, 大的节点会变成master
...
virtual_ipaddress{ //虚拟服务器ip
192.168.1.123
192.168.1.124
}
} vitrual_server 192.168.1.123{
delay_loop 6
lb_glgo rr //loadbalance 算法
... real_server 192.168.11.123{
weight 1 //权重
TCP_CHECK{
connect_timeout 3
delay_before_retry 3
connect_port 80
}
}
}

分布式系列十三: nginx的更多相关文章

  1. 后端分布式系列:分布式存储-HDFS 与 GFS 的设计差异

    「后端分布式系列」前面关于 HDFS 的一些文章介绍了它的整体架构和一些关键部件的设计实现要点. 我们知道 HDFS 最早是根据 GFS(Google File System)的论文概念模型来设计实现 ...

  2. 分布式系列九: kafka

    分布式系列九: kafka概念 官网上的介绍是kafka是apache的一种分布式流处理平台. 最初由Linkedin开发, 使用Scala编写. 具有高性能,高吞吐量的特定. 包含三个关键能力: 发 ...

  3. 分布式系列四: HTTP及HTTPS协议

    分布式系列四: HTTP及HTTPS协议 非常全面的一篇HTTP的文章: 关于HTTP协议,一篇就够了 还有一个帮助理解HTTPS的文章: 也许,这样理解HTTPS更容易 本文的一些描述摘自这篇文章 ...

  4. 分布式系列六: WebService简介

    WebSerice盛行的时代已经过去, 这里只是简单介绍下其基本概念, 并用JDK自带的API实现一个简单的服务. WebSerice的概念 WebService是一种跨平台和跨语言的远程调用(RPC ...

  5. 分布式系列 - dubbo服务telnet命令【转】

    dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本服务提供端口支持telnet命令,下面我以通过实例抛砖引玉一下: 1.连接服务 测试对应IP和端口下的d ...

  6. nginx高性能WEB服务器系列之八--nginx日志分析与切割

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  7. nginx高性能WEB服务器系列之七--nginx反向代理

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  8. nginx高性能WEB服务器系列之六--nginx负载均衡配置+健康检查

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  9. struts2官方 中文教程 系列十三:利用通配符选择方法

    介绍 在本教程中,我们将介绍如何在struts.xml中配置action节点以达到仅使用一个action节点将几个不同的url关联到特定action类的特定方法.这样做的目的是减少struts.xml ...

随机推荐

  1. Redis报错 Server started, Redis version 3.2.13 Can't handle RDB format version 9 Fatal error loading the DB: Invalid argument. Exiting.

    在/usr/local/etc 目录下 运行 redis-server 命令重启 redis 服务发现报错,报错信息如下: 如上报错的含义是:当前的redis的版本是3.2.13版本,无法处理 ver ...

  2. 毕业设计5:基于MicroPython的智能火灾报警器系统的设计与实现

    随着现代家庭用火.用电量的增加,家庭火灾发生的频率越来越高.家里一旦发生火灾,如果出现扑救不及时.灭火器材缺乏.以及在场人惊慌失措.逃生迟缓等不利情况下,最终就会导致产生重大的生命财产的损失. 消防部 ...

  3. 基于jQuery实现简单的js模块化

    在多人合作完成网页,经常遇到大家的js代码相互影响的问题.现在有许多模块化的前端框架,应该是可以解决这个问题.但本人并非前端开发人员,那些框架都没用过,只对jQuery相对熟悉,就想用jQuery来解 ...

  4. 零代码第一步,做个添加数据的服务先。node.js + mysql

    node.js + mysql 实现数据添加的功能.万事基于服务! 增删改查之添加数据. 优点:只需要设置一个json文件,就可以实现基本的添加功能,可以视为是零代码. 添加数据的服务实现的功能: 1 ...

  5. 【故障公告】推荐系统中转站撑爆服务器 TCP 连接引发的故障

    上周五下午,我们在博客中部署了推荐系统,在博文下方显示“最新IT新闻”的地方显示自动推荐的关联博文.我们用的推荐系统是第四范式的推荐服务,我们自己只是搭建了一个推荐系统中转站(基于 ASP.NET C ...

  6. 如何改善SSH连接过慢(效率)

    +++++++++++++++++++++++++++++++++++++++++问题:通过SSH链接远程Linux主机过慢.重点:学习如何通过调整ssh_config配置文件,提高SSH连接效率.时 ...

  7. react native输入框定位在底部(虚拟键盘弹起)

    1.通过Keyboard获取键盘高度,改变定位的bottom 缺点:虚拟键盘完全弹起时,才会获取到键盘高度,定位稍有延迟,而且键盘收起时,定位会出现悬空状态,然后再回到底部 import React, ...

  8. java篇 之 流程控制语句

    条件判断语句 条件语句: If(boolean类型) {} else {}    (打大括号避免出错) switch (export)语句:export的类型必须是 byte,short,char,i ...

  9. matplotlib设置中文标签

    import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei']

  10. 接入HTTPS协议的CAS登录配置

    1.在CAS服务器创建tomcat.keystore(记住keystone创建时输入的密码) keytool -genkeypair -alias "tomcat" -keyalg ...