设为首页 收藏本站
查看: 965|回复: 0

[经验分享] Nginx-linux

[复制链接]

尚未签到

发表于 2018-11-12 07:25:59 | 显示全部楼层 |阅读模式
  Nginx
  首先了解Nginx的功能和特性
  Nginx的特性:
  模块化设计、较好扩展性
  高可靠性
  master-->worker
  低内存消耗
  10000个keep-alive连接在Nginx仅消耗2.5MB
  支持热部署
  不停机而更新配置文件、更换日志文件、更新服务器程序版本
  基本功能:
  静态资源的web服务器,能缓存打开的文件 描述符
  http, smtp, pop3协议的反向代理服务器,缓存、负载均衡;
  支持FastCGI (fpm)
  模块化,非DSO机制,过滤器zip,SSI及图像大小调整;
  支持SSL
  扩展功能:
  基于名称和IP的虚拟主机;
  支持keepalive
  支持平滑升级
  定制访问日志 ,支持使用日志缓冲区提高日志存储性能
  支持url rewrite
  支持路径别名
  支持基于IP及用户的访问控制
  支持速率限制,支持并发数限制
  Nginx的基本架构:
  一个master进程,生成一个或多个worker
  事件驱动: epoll, kqueue, /dev/poll (event ports)
  消息通知:select, poll, rt signals
  支持sendfile, sendfile64
  支持AIO
  支持mmap
  nginx: 非阻塞、事件驱动、一个master生成一个或多个worker, 每个worker响应n个请求;
  模块类型:
  核心模块
  Standard HTTP modules
  Optional HTTP modules
  Mail modules
  3rd party modules
  如何安装及使用nginx
  【1】
  首先进行nginx安装:
  从官网下载好源码包并解压到/usr/src目录中:tar xf nginx-1.6.2.tar.gz -C /usr/src
  为防止编译安装过程中出现问题,yum安装Development Tools和Server Platform Development包组
  添加nginx系统组:groupadd -r nginx
  添加nginx系统用户:useradd -g nginx -r nginx
  切换到nginx的解压目录中,准备执行编译安装相关操作:cd /usr/src/nginx-1.6.2/;建议编译安装之前先使用./configure --help 根据自己的需求添加模块。
  编译安装命令
  rpm及源码安装:
  # ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi
  # make && make install
  Tmalloc, gperftools
  注:若出现编译错误,大多数是缺少对应模块功能的开发包,比如--with-pcre,若事先没有安装支持正则表示式的开发包pcre-devel,很有可能会报错。
  make
  make install
  然后为nginx提供服务脚本:
  vim /etc/init.d/nginx
  #!/bin/sh
  #
  # nginx - this script starts and stops the nginx daemon
  #
  # chkconfig:   - 85 15 # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \#               proxy and IMAP/POP3 proxy server# processname: nginx# config:      /etc/nginx/nginx.conf# config:      /etc/sysconfig/nginx# pidfile:     /var/run/nginx.pid# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/network# Check that networking is up.[ "$NETWORKING"= "no"] && exit0nginx="/usr/local/nginx/sbin/nginx"prog=$(basename$nginx)NGINX_CONF_FILE="/etc/nginx/nginx.conf"[ -f /etc/sysconfig/nginx] && . /etc/sysconfig/nginxlockfile=/var/lock/subsys/nginxmake_dirs() {# make required directoriesuser=`nginx -V 2>&1 | grep"configure arguments:"| sed's/[^*]*--user=\([^ ]*\).*/\1/g'-`options=`$nginx -V 2>&1 | grep'configure arguments:'`foropt in$options; doif[ `echo$opt | grep'.*-temp-path'` ]; thenvalue=`echo$opt | cut-d "="-f 2`if[ ! -d "$value"]; then# echo "creating" $valuemkdir-p $value && chown-R $user $valuefifidone}start() {[ -x $nginx ] || exit5[ -f $NGINX_CONF_FILE ] || exit6make_dirsecho-n $"Starting $prog: "daemon $nginx -c $NGINX_CONF_FILEretval=$?echo[ $retval -eq0 ] && touch$lockfilereturn$retval}stop() {echo-n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq0 ] && rm-f $lockfilereturn$retval}restart() {configtest || return$?stopsleep1start}reload() {configtest || return$?echo-n $"Reloading $prog: "killproc $nginx -HUPRETVAL=$?echo}force_reload() {restart}configtest() {$nginx -t -c $NGINX_CONF_FILE}rh_status() {status $prog}rh_status_q() {rh_status >/dev/null2>&1}case"$1"instart)rh_status_q && exit0$1;;stop)rh_status_q || exit0$1;;restart|configtest)$1;;reload)rh_status_q || exit7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q || exit0;;*)echo$"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit2esac将服务脚本的权限设置为可执行:chmod +x /etc/init.d/nginx
  将服务加入服务列表中,并设置为开机自启动:chkconfig --add nginx && chkconfig nginx on
  测试启动nginx:service nginx start
  【2】
  http上下文专用于配置用于http的各模块,此类指令非常的多,每个模块都有其专用指定。其配置框架:
  1234567891011121314151617181920http {upstreamserver {....}server {#定义虚拟主机listen IP:PORT;server_name SER_NAMElocation /URL{if...{...}root "/path/to/somewhere";...}}server {……}}注:与http配置相关的指令必须放在http、server、location、upstream、if块中
  来介绍下http配置段的常用参数:
  1、虚拟主机的相关配置
  使用server {……}用于定义一个虚拟主机
  listen IP_ADDR [:port] [default_server]
  设定监听的端口号,可以省略IP和port其中之一,还可以添加default_server参数将其设置成默认服务器,用于匹配客户端的host请求
  server_name Serv_NAME
  设定主机名,后可跟多个主机名,主机名称还可以使用通配符和正则表达式(要以~开头)
  注意:其匹配次序为:
  location [=|~|~*|^~] /URI {……}允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理,location可以嵌套
  其中=表示精确匹配
  ~、~*都表示正则表达式模式匹配,只是前者在匹配时区分字符大小写
  ^~表示作URI左半部分匹配,匹配时不检查正则表达式
  listen
  监听的端口
  完整格式 :listen address[:port] [default_server] [ssl] [spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
  listen address[:port] [default_server] ssl
  backlog=number: 指明TCP协议backlog队列的大小。默认为-1,表示不设置;
  rcvbuf=size:设定监听句柄的SO_RCVBUF参数;
  例如:
  listen 172.16.100.8:8080
  处于同一优先级的URI,排在前面的先被匹配
  root设置web资源路径映射;用于指明请求的URL所对应的文档的根目录路径;如:
  location /images/ {
  root "/web/imgs/";
  }
  alias定义路径别名,
  location /images/ {
  root "/web/imgs/";
  }
  root表示路径为对应location的“ /” URL;alias表示路径映射,即location中的URL是相对于alias后所设定的路径而言
  index设定默认的主页面
  index index.html;
  error_page code [...] [=code] URI | @name
  根据http状态码重定向错误页面
  error_page  404   /404.html
  =[code]: 以指定的响应码进行响应;省略code表示以新资源的响应码为响应码;
  try_files
  try_files path1[,path2,...] URI
  error_page STATUS …… URL根据http状态码重定向至错误页面
  error_page STATUS=NEW_STATUS URL以指定的状态码响应客户端
  如:
  server {
  listen       80;
  server_name  www.stu24.com;
  location / {
  root   html;
  index  index.html index.htm;
  }
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
  root   html;
  }
  }
  2、网络连接相关的配置
  1、keepalive_timeout time;
  保持连接的超时时长,默认为75s;
  2、keepalive_requests #;
  在一次保持连接上允许承载最大资源请求数;
  3、keepalive_disable [msie6|safari|none]
  为指定类型的浏览器禁用长连接;
  4、tcp_nodelay on|off
  对长连接是否使用TCP_NODELAY选项;
  5、client_header_timeout time;
  读取http请求报文首部的超时时长;
  6、client_body_timeout time;
  读取http请求报文body部分的超时时长;
  7、send_timeout time;
  发送响应报文的超时时长;
  3、对客户端请求进行限制的相关配置
  1、limit_except METHOD {...}
  指定对范围之外的其它方法的访问控制;
  limit_except GET {
  allow 172.16.0.0/16;
  deny all;
  }

  2、client_body_max_size>  限制请求报文中body部分的上限;通过检测请求报文首部中的"Content_Length"来判定;
  3、limit_rate speed;
  限制客户端每秒种传输的字节数,默认为0,表示无限制;

  client_body_max_size>  limit_rate SPEED限制客户端每秒种传输的字节数,默认为0,表示无限制;
  4、对内存或磁盘资源进行分配
  1、client_body_in_file_only on|clean|off;
  请求报文的body部分是否可暂存于磁盘:
  on表示允许,并且即使请求结束,也不会删除暂存的内容;clean表示会删除;off不允许暂存;
  2、client_body_in_single_buffer on|off
  请求报文的body部分是否可暂存于内存内核的buffer中
  默认为off

  3、client_body_buffer_size>  允许之后要多大的空间
  4、client_body_temp_path DIR [lv1 [lv2 [lv3 [lv4]]]]
  存在什么位置   几级子目录
  例如:client_body_temp_path /var/tmp/nginx/client 1 2

  5、client_header_buffer_size>  正常情况下接受用户请求报文的header预留的内存的空间大小
  5、MIME类型相关的配置
  1、types {……}定义MIME types至文件的扩展名;
  例如:
  types {
  text/html .html;
  image/jpeg  .jpg;
  }
  2、default_type MIME-TYPE当找不到相应的MIME type与文件扩展名之间的映射时,使用默认的MIME-TYPE作为HTTP header中的Content-Type
  6、文件操作优化相关的配置:
  1、sendfile on|off
  2、aio on|off
  是否启用异步IO

  3、directio>  是否使用O_DIRECT选项去请求读取文件;缓冲区大小是size;与sendfile功能互斥
  4、open_file_cache max=N[inactive=time]|off
  nginx可以缓存以下三种信息:
  (1)文件句柄、文件大小和最近一次的修改时间;
  (2)打开目录的目录结构;
  (3)没有找到的或者没有权限操作的文件的相关信息
  max=N表示可缓存的最大条目上限;一旦到达上限,则会使用LRU最近最少使用从缓存中删除最近最少使用的条目;
  inactive=time:在inactive指定的时长内没有被访问的缓存条目就会淘汰,默认为60S
  5、open_file_cache-errors on|off
  是否缓存文件缓存中缓存打开文件时出现找不到路径,没有权限等的错误信息;
  6、open_file_cache_min_uses time:
  每隔多久检查一次缓存中缓存条目的有效性 ,默认为60S
  重点关注:server{},location{},listen,server_name,root,alias,keepalive_timeout,keepalive_requests,error_page
  如:
  open_file_cache max=1000 inactive=20s;
  open_file_cache_errors on|off是否缓存打开文件错误的信息
  open_file_cache_min_uses INTERVAL检查一次缓存中缓存条目有效性的时间间隔;默认60s;
  讲了一大堆,其实我们重点关注以下几项就足以应付生产环境中的需求了:
  server{}, location{}, listen, server_name, root, alias, keepalive_timeout,keepalive_requests, error_page
  【3】
  Nginx常用配置(配置文件/etc/nginx/nginx.conf)
  Nginx的主配置文件由main、http、mail等几个段组成,这些个段通常也被称为Nginx的上下文,每个段的配置格式如下所示:
   {
   ;
  }
  需要注意的是,其每一个指令都必须使用分号(;)结束,否则视为语法错误。
  main配置段的常用参数
  1、保证Nginx正常运行的相关配置:
  user USERNAME GROUP指定运行worker进程的用户和组,如果在编译中没有指定,需将注释去掉,以nobody身份运行worker进程
  pid /PATH/TO/PID_FILE指定Nginx的pid文件,如果在编译中没有指定,需要在main配置段中定义
  worker_rlimit_nofileNUM  设定worker进程所能够打开的文件描述符个数的最大值。
  worker_rlimit_sigpending NUM  指定每个用户能够发往worker进程的信号的数量
  2、优化性能的相关配置
  worker_process NUM设定master进程启动的worker进程数,具体需要看CPU的核心数,生产环境中常将其设置为cpu核心数减1
  worker_cpu_affinity CPUMASK…… 绑定worker进程至指定CPU上,如:
  worker_processes     4;
  worker_cpu_affinity 0001 0010 0100 1000;
  timer_resolution INTERVAL设定更新缓存的时间间隔,如:timer_resolution  100ms;
  worker_priority nice_NUM设定worker进程运行的优先级(按nice值设置),默认为0;如:worker_priority -20
  3、事件event相关的配置(以下配置需写在event {……}中)
  worker_connections NUM  每个worker进程所能够响应的最大并发请求数,它与worker_processes共同决定能响应的最大客户数maxclients的值。
  maxclients = worker_processes * worker_connections
  而在反向代理场景中,其计算方法与上述公式不同,因为默认情况下浏览器将打开2个连接,而nginx会为每一个连接打开2个文件描述符,因此,其maxclients的计算方法为:
  maxclients = worker_processes * worker_connections/4
  accept_mutex on|off是否打开Nginx的负载均衡锁,设为on时,能使多个worker进程轮流地、序列化地与响应新请求
  lock_file /PATH/TO/LOCK_FILE负载均衡锁的路径
  accept_mutex_delay INTERVAL等待负载均衡锁的时间间隔
  use epoll|rgsig|select|poll设定worker进程使用的事件模型IO,建议让Nginx自动选择
  4、用于调试、定位问题的相关配置
  daemon off|on是否以守护进程的方式启动nginx,定位问题时设为off,正常环境为on
  master_process on|off是否以master/worker模型来运行nginx
  error_log /PATH/TO/error_log debug|info|notice|warn|error|crit|alert|emerg设定错误日志文件及其级别;出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效;要禁用错误日志,不能使用“error_log off;”,而要使用类似如下选项:                                             error_log /dev/null crit
  Nginx优化相关配置:
  1、基于IP的访问控制
  在http, server, location中使用allow, deny指令定义,匹配法则类似于iptables,自上而下依次匹配,如:
  location / {
  deny  192.168.1.1;
  allow 192.168.1.0/24;
  allow 10.1.1.0/16;
  deny  all;
  }
  2、基于用户的basic认证配置
  auth_basic "AUTH_NAME"
  auth_basic_user_file /PATH/TO/PASSWD_FILE,建议使用htpasswd命令创建用户账号文件;
  例如:
  location /wp-login.php {
  auth_basic 'Welcome WordPress';
  auth_basic_user_file  /home/mypwd/pass;
  }
  3、基于gzip实现响应报文压缩
  gzip on|off  是否开启gzip压缩,开启之后节省网络带宽,却增加了服务器CPU的开销
  gzip_http_version 1.1|1.0  设定启用gzip压缩时客户端请求使用的http协议版本号
  gzip_min_length LENGTH 设定最小压缩的页面,注:若页面过小,可能导致页面越压越大,单位为B,如:gzip_min_length 1024

  gzip_buffers NUM>  gzip_comp_level 3 设定gzip的压缩级别,1压缩比最小处理速度最快,9压缩比最大但处理最慢,同时也最消耗CPU,一般设置为3就可以了
  gzip_types MIME_TYPE设定gzip压缩的MIME类型
  gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] 根据某些请求和应答来决定是否在对代理请求的应答启用压缩,代理请求取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数:
  off 为所有代理请求禁用压缩。
  expired 当“Expires”头禁用缓存时启用压缩。
  no-cache 当“Cache-Control”头设置为no-cache时启用压缩。
  no-store  当“Cache-Control”头设置为no-store时启用压缩。
  private  当“Cache-Control”头设置为private时启用压缩。
  no_last_modified  当“Last-Modified”没有定义时启用压缩。
  no_etag  没有“ETag”头时启用压缩。
  auth 当有一个“Authorization”头时启用压缩。
  any  为所有请求启用压缩。
  gzip_disable 设定在某些浏览器上不启用gzip压缩
  gzip使用实例:
  1
  2
  3
  4
  5
  6
  gzip on;
  gzip_comp_level 3;
  gzip_buffers 4 8k;
  gzip_http_version 1.1;
  gzip_disable "MSIE [1-6]";
  gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  4、定制响应首部
  add_header key value [always],如:add_header  Content-Type 'text/html; ';
  expires TIME,设定缓存时间
  5、定制访问日志
  log_format NAME LOG_FORMAT 设置日志的记录格式,
  access_log 指定日志文件的存放路径、格式和缓存大小,也可以使用off关闭日志功能,
  $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
  $remote_user  用来记录客户端用户名称;
  $time_local    用来记录访问时间与时区;
  $request   用来记录请求的url与http协议;
  $status   用来记录请求状态;成功是200,
  $body_bytes_sent  记录发送给客户端文件主体内容大小;
  $http_referer  用来记录从那个页面链接访问过来的;
  $http_user_agent  记录客户端浏览器的相关信息;
  6、定义合法引用,防盗链
  valid_referers none | blocked | server_names | string ...
  7、定义路径重写,与正则表达式结合if判断使用
  rewrite regex replacement [flag]
  flag标记有四种格式:
  last 相当于Apache中的L
  break 中止Rewirte,不在继续匹配
  redirect  返回临时重定向的HTTP状态302,相当于Apache中的R
  permanent 返回永久重定向的HTTP状态301,相当于Apache中的R=301
  if (condition) {
  ...
  }
  条件conditon可以是如下任何内容:
  一个变量名;false如果这个变量是空字符串或者以0开始的字符串;
  使用= ,!= 比较的一个变量和字符串
  使用~, ~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用" 或' 包围
  使用-f ,!-f 检查一个文件是否存在
  使用-d, !-d 检查一个目录是否存在
  使用-e ,!-e 检查一个文件、目录、符号链接是否存在
  使用-x , !-x 检查一个文件是否可执行
  return STATUS URL 结束规则时执行并返回状态码给客户端
  set VARIABLE VALUE 定义一个变量,并给变量赋值
  最后总结:nginx
  主配置
  http
  core:server{},location{},
  access
  basic
  gzip
  ssl
  rewrite
  log
  referer
  stub_status
  headers


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-633856-1-1.html 上篇帖子: nginx-freeterman 下篇帖子: Nginx location段root和alias区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表