Nginx部署教程及常用案例

一.nginx是做什么的?

Nginx 是一个HTTP和反向代理服务器,一个邮件代理服务器和一个通用的TCP/UDP代理服务器。

  • 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

  • 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

  • 作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

  • Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器:Nginx启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。

二.nginx如何安装?

1.windows环境

请到nginx: download这个页面下载zip压缩包,解压安装.

解压后,目录中会有一个nginx.exe,运行即可启动nginx.

2. Linux环境

    • 使用yum命令(centos服务器)安装

      运行命令yum install nginx;即可完成安装.

      安装完成之后,执行nginx即可启动服务.

      默认路径配置:

      (1) Nginx配置路径:/etc/nginx/

      (2) PID目录:/var/run/nginx.pid

      (3) 错误日志:/var/log/nginx/error.log

      (4) 访问日志:/var/log/nginx/access.log

      (5) 默认站点目录:/usr/share/nginx/html

    • 使用编译安装

      使用weget命令,或者前往nginx: download下载包.

      weget http://nginx.org/download/nginx-1.18.0.tar.gz

      若提示weget command not found ,则请执行以下命令,安装weget

      yum -y install wget

      编译安装所需的额外插件

      Gcc:yum install gcc c++ (用于编译c、c++代码)
      Pcre:yum install -y pcre pcre-devel(用c语言编写的正则表达式函数库))
      Zlib:yum install -y zlib zlib-devel(用于数据压缩的函式库))
      OpenSSL:yum install -y openssl openssl-devel安全套接字层密码库))

      插件安装命令

      yum install -y pcre pcre-devel
      yum install -y zlib zlib-devel 
      yum install -y openssl openssl-devel  

      编译nginx

      tar -zxvf nginx-1.15.tar.gz
      cd nginx-1.15
      ./configure
      make
      make install

      启动nginx

      cd /usr/local/nginx/
      cd sbin/
      ./nginx 

      若想要全局都能执行nginx命令,可以编辑配置文件.将nginx加入到系统变量

      1. vim /etc/profile
      2. 添加nginx的路径配置
      PATH=$PATH:/usr/local/nginx/sbin
      export PATH
      3.保存退出,执行命令更新配置
      source /etc/profile

三.Nginx基本配置文件详解

1.查看nginx的安装目录

       rpm -ql nginx

  • rpm是linux的rpm包管理工具

  • -q代表询问模式

  • -l 代表返回列表

2.nginx.conf配置详解

     进入/etc/nginx.使用vim打开nginx.conf

cd /etc/nginx
vim nginx.conf

    nginx.conf的内容

#运行用户,默认即是nginx,可以不进行设置
user  nginx;
#Nginx进程,一般设置为和CPU核数一样
worker_processes  1;   
#错误日志存放目录
error_log  /var/log/nginx/error.log warn;
#进程pid存放位置
pid        /var/run/nginx.pid;


events {
    worker_connections  1024; # 单个后台进程的最大并发数
}


http {
    include       /etc/nginx/mime.types;   #文件扩展名与类型映射表
    default_type  application/octet-stream;  #默认文件类型
    #设置日志模式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;   #nginx访问日志存放位置

    sendfile        on;   #开启高效传输模式
    #tcp_nopush     on;    #减少网络报文段的数量

    keepalive_timeout  65;  #保持连接的时间,也叫超时时间

    #gzip  on;  #开启gzip压缩

    include /etc/nginx/conf.d/*.conf; #包含的子配置项位置和文件

3.配置文件组成

    • 全局块

      从配置文件到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户、允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等

    • events块

      events块涉及的指令主要影响Nginx服务器与用户的网络连接

    • http块

      Nginx服务器培配置中最频繁的部分、代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都在这里

      • http全局块

      http全局快配置的指令包括文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单链接请求书上限等

      • server块

      每个server块也分为全局server块,以及可以同时包含多个location块

      (1)全局server块

      最常见的配置是本虚拟主机的监听配置和本虚拟机的名称或IP配置

      (2)location 块

      一个server可以配置多个location块

      这块的主要作用是基于Nginx服务器接收到的请求字符串(例如:server_name/uri-string),对虚拟主机名称之外的字符串进行(例如 前面的uri-string)进匹配,对特定的请求进行处理,地址指向,数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

四.Nginx的常用命令

  • 启动

    • 直接使用nginx启动

    • 使用systemctl start nginx.service启动

  • 查看

    • 使用ps aux | grep nginx查询

    • 使用systemctl status nginx.service查看

  • 停止

    • 立即停止服务, nginx -s stop

    • 从容停止服务 nginx -s quit

    • 杀死进程 killall nginx

  • 重启

    • systemctl restart nginx.service

  • 更新

    • nginx -s reload

  • 查看端口占用

    • netstat -tlnp

五.自定义错误页面和访问限制

  • 错误页面跳转

              在nginx.conf文件中,可以针对不同的错误,来进行不同的跳转

  • 访问权限控制(配置遵循先出现的设置会覆盖后出现的设置)

    • 分块控制权限

    • 使用正则表达式设置访问权限

六.使用域名配置虚拟主机

  • 配置基于不同端口的监听服务

    server{
        listen 8010;
        server_name _;
        root /wangzai/images;
        index a.jpg;

    }
  • 基于域名的监听服务配置

server{
        listen 80;
        server_name nginx2.jspang.com;
        location / {
                root /usr/share/nginx/html/html8001;
                index index.html index.htm;
        }
}

六.Nginx反向代理的设置

  • 正向代理

如果把局域网外的internet想象成一个巨大的资源库,则局域网中的客户端要访问internet,则需要通过 代理服务器来访问,这种代理服务就称为正向代理。用作正向代理来代理进行上网等功能。

  • 反向代理

其实客户端对代理是无感知到,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

  • 负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

  • 动静分离

为了加快网站的解析速度,可以将动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力

  • 反向代理常用指令

proxy_set_header :在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。

proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。

proxy_read_timeout : 配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。

proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。

proxy_redirect :用于修改后端服务器返回的响应头中的Location和Refresh。

七.Nginx设备适配

  • 使用内置变量 $http_user_agent 获取请求客户端的userAgent

server{ listen 80; server_name nginx2.jspang.com; location / { root /usr/share/nginx/pc; if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') { root /usr/share/nginx/mobile; } index index.html; } }

八.Gzip压缩配置

  • gzip配置指令

gzip : 该指令用于开启或 关闭gzip模块。

gzip_buffers : 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。

gzip_comp_level : gzip压缩比,压缩级别是1-9,1的压缩级别最低,9的压缩级别最高。压缩级别越高压缩率越大,压缩时间越长。

gzip_disable : 可以通过该指令对一些特定的User-Agent不使用压缩功能。

gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从相应消息头的Content-length中进行获取。

gzip_http_version:识别HTTP协议版本,其值可以是1.1.或1.0.

gzip_proxied : 用于设置启用或禁用从代理服务器上收到相应内容gzip压缩。

gzip_vary : 用于在响应消息头中添加Vary:Accept-Encoding,使代理服务器根据请求头中的Accept-Encoding识别是否启用gzip压缩。

  • gzip的简单配置

九.GoAccess请求监控服务搭建

  • 安装

$ wget https://tar.goaccess.io/goaccess-1.4.tar.gz
$ tar -xzvf goaccess-1.4.tar.gz
$ cd goaccess-1.4/
$ ./configure --enable-utf8 --enable-geoip=legacy
$ make
# make install

若是出现错误,

checking for GeoIP_new in -lGeoIP... noconfigure: error:     *** Missing development files for the GeoIP library

执行命令 yum install glib2 glib2-devel GeoIP-devel ncurses-devel zlib zlib-devel 即可.

  • 配置

默认配置文件位于 /user/local/etc/goaccess.conf

取消以下三行的注释

time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

注释说明

%t  匹配time-format格式的时间字段
%d  匹配date-format格式的日期字段
%h  host(客户端ip地址,包括ipv4和ipv6)
%r  来自客户端的请求行
%m  请求的方法
%U  URL路径
%H  请求协议
%s  服务器响应的状态码
%b  服务器返回的内容大小
%R  HTTP请求头的referer字段
%u  用户代理的HTTP请求报头
%D  请求所花费的时间,单位微秒
%T  请求所花费的时间,单位秒
%^  忽略这一字段

  • 命令

    • 控制台输出模式(修改粗体文件实际路径)

      goaccess -a -d -f /data/logs/fanhaobai.com.access.log -p /etc/goaccess.conf

    • HTML输出模式

      goaccess -a -d -f /data/logs/fanhaobai.com.access.log -p /etc/goaccess.conf -o /data/html/hexo/public/go-access.html

    • 实时更新模式

      goaccess -a -d -f /data/logs/fanhaobai.com.access.log -p /etc/goaccess.conf -o /data/html/hexo/public/go-access.html --real-time-html --daemonize

常用命令参数

$ goaccess -h
# 常用参数
-a --agent-list 启用由主机用户代理的列表。为了更快的解析,不启用该项
-d --with-output-resolver 在HTML/JSON输出中开启IP解析,会使用GeoIP来进行IP解析
-f --log-file 需要分析的日志文件路径
-p --config-file 配置文件路径
-o --output 输出格式,支持html、json、csv
-m --with-mouse 控制面板支持鼠标点击
-q --no-query-string 忽略请求的参数部分
--real-time-html 实时生成HTML报告
--daemonize 守护进程模式,--real-time-html时使用
  • 汉化

    安装中文语言包

yum install kde-l10n-Chinese

yum reinstall glibc-common

修改linux配置

vim /etc/locale.conf,修改LANG=”zh_CN.UTF-8”

重启系统

重启命令 : reboot

十.负载均衡

轮询,默认方式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务挂了,能自动剔除;

weight,权重分配,指定轮询几率,权重越高,在被访问的概率越大,用于后端服务器性能不均的情况;

ip_hash,每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决动态网页 session 共享问题。负载均衡每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的;

fair(第三方),按后端服务器的响应时间分配,响应时间短的优先分配,依赖第三方插件 nginx-upstream-fair,需要先安装;

简单的配置

http {
  upstream myserver {
  	# ip_hash;  # ip_hash 方式
    # fair;   # fair 方式
    server 127.0.0.1:8081;  # 负载均衡目的服务地址
    server 127.0.0.1:8080;
    server 127.0.0.1:8082 weight=10;  # weight 方式,不写默认为 1
  }
 
  server {
    location / {
    	proxy_pass http://myserver;
      proxy_connect_timeout 10;
    }
  }
}

十一.跨域

  • 跨域是基于浏览器的同源策略决定的

# 同源的例子
http://example.com/app1/index.html  # 只是路径不同
http://example.com/app2/index.html

http://Example.com:80  # 只是大小写差异
http://example.com

# 不同源的例子
http://example.com/app1   # 协议不同
https://example.com/app2

http://example.com        # host 不同
http://www.example.com
http://myapp.example.com

http://example.com        # 端口不同
http://example.com:8080

  • 使用反向代理解决跨域问题

           将两个域名都映射到统一IP上面

           将页面fe.sherlocked93.club的请求全部代理到be.sherlocked93.club,绕过跨域问题

server {
  listen 9001;
  server_name fe.sherlocked93.club;

  location / {
    proxy_pass be.sherlocked93.club;
  }
}

  • 配置header解决跨域问题

    a,b两个页面

    请求直接访问b可以,但是通过前端页面a中转b会报跨域错误.

# /etc/nginx/conf.d/be.sherlocked93.club.conf

server {
  listen       80;
  server_name  be.sherlocked93.club;
  
	add_header 'Access-Control-Allow-Origin' $http_origin;   # 全局变量获得当前请求origin,带cookie的请求不支持*
	add_header 'Access-Control-Allow-Credentials' 'true';    # 为 true 可带上 cookie
	add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';  # 允许请求方法
	add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers;  # 允许请求的 header,可以为 *
	add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
	
  if ($request_method = 'OPTIONS') {
		add_header 'Access-Control-Max-Age' 1728000;   # OPTIONS 请求的有效期,在有效期内不用发出另一条预检请求
		add_header 'Content-Type' 'text/plain; charset=utf-8';
		add_header 'Content-Length' 0;
    
		return 204;                  # 200 也可以
	}
  
	location / {
		root  /usr/share/nginx/html/be;
		index index.html;
	}
}
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值