dsg_16 nginx

nginx

nginx的作用

  • http web服务器
  • 反向代理服务器
  • mail代理服务器
  • 负载均衡(应用层)

nginx的特点

  • 高并发连接,nginx能够支撑3-5万并发连接
  • 内存消耗小,10个nginx进程会消耗150M内存
  • 成本低廉

nginx安装

nginx下载

nginx官网
dsg_16 nginx

nginx安装

	#1. 安装之前需要先安装以下环境
	#a. 查看是否安装了gcc
	[root@Centos100 nginx]# yum list installed | grep gcc
	gcc.x86_64                            4.8.5-44.el7                     @base    
	gcc-c++.x86_64                        4.8.5-44.el7                     @base    
	libgcc.x86_64                         4.8.5-44.el7                     @base
	#如果有上面的结果,表示安装了,否则执行以下命令安装gcc
	[root@Centos100 nginx]# yum -y install gcc gcc-c++ autoconf automake
	#b. 查看是否安装了zlib
	[root@Centos100 nginx]# yum list installed | grep zlib
	zlib.x86_64                           1.2.7-17.el7                     @anaconda
	#如果有上面的结果,表示安装了,否则执行以下命令安装zlib
	[root@Centos100 nginx]# yum -y install zlib zlib-devel openssl openssl-devel pcre-devel
	#c. 查看是否安装了pcre-devel
	[root@Centos100 nginx]# yum list installed | grep pcre-devel
	pcre-devel.x86_64                     8.32-17.el7                      @base
	#如果有上面的结果,表示安装了,否则执行以下命令安装pcre-devel
	[root@Centos100 nginx]# yum -y install pcre-devel
	#d. 查看是否安装了openssl-devel
	[root@Centos100 nginx]# yum list installed | grep openssl
	openssl.x86_64                        1:1.0.2k-21.el7_9                @updates 
	openssl-devel.x86_64                  1:1.0.2k-21.el7_9                @updates 
	openssl-libs.x86_64                   1:1.0.2k-21.el7_9                @updates
	[root@Centos100 nginx]# yum -y install openssl openssl-devel
	
	#2. tar开
	[root@Centos100 nginx]# tar -zvxf nginx-1.18.0.tar.gz

	#3. 到nginx-1.18.0目录下,查看帮助,如下面所示
	[root@Centos100 nginx]# cd nginx-1.18.0
	[root@Centos100 nginx-1.18.0]# ./configure --help

	#4. 设置安装路径,选择安装的功能模块,然后编译,\表示换行,方便复制到命令行中
	[root@Centos100 nginx-1.18.0]# ./configure\
	 --prefix=/software/nginx/nginx\
	 --sbin-path=/software/nginx/nginx/sbin/nginx\
	 --modules-path=/software/nginx/nginx/modules\
	 --conf-path=/software/nginx/nginx/conf/nginx.conf\
	 --error-log-path=/software/nginx/nginx/log/error-log.out\
	 --pid-path=/software/nginx/nginx/pid\
	 --lock-path=/software/nginx/nginx/lock\
	 --user=root\
	 --group=root\
	 --with-http_ssl_module\
	 --with-http_flv_module\
	 --with-http_gzip_static_module\
	 --http-log-path=/software/nginx/nginx/log/http-log.out\
	 --http-client-body-temp-path=/software/nginx/nginx/http-client-body-temp\
	 --http-proxy-temp-path=/software/nginx/nginx/http-proxy-temp\
	 --http-fastcgi-temp-path=/software/nginx/nginx/http-fastcgi-temp\
	 --with-http_stub_status_module
	Configuration summary
  + using system PCRE library
  + using system OpenSSL library
  + using system zlib library

  #编译执行后最后会出现下面的结果
  nginx path prefix: "/software/nginx/nginx"
  nginx binary file: "/software/nginx/nginx/sbin/nginx"
  nginx modules path: "/software/nginx/nginx/modules"
  nginx configuration prefix: "/software/nginx/nginx"
  nginx configuration file: "/software/nginx/nginx/nginx-conf.conf"
  nginx pid file: "/software/nginx/nginx/pid"
  nginx error log file: "/software/nginx/nginx/log/error-log.out"
  nginx http access log file: "/software/nginx/nginx/log/http-log.out"
  nginx http client request body temporary files: "/software/nginx/nginx/http-client-body-temp"
  nginx http proxy temporary files: "/software/nginx/nginx/http-proxy-temp"
  nginx http fastcgi temporary files: "/software/nginx/nginx/http-fastcgi-temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

 #5. 编译后出现上面的结果表示编译成功!,成功后执行下面的命令,安装nginx
 [root@Centos100 nginx-1.18.0]# make && make install

nginx编译安装帮助文档:


  --help                             print this message

  --prefix=PATH                      set installation prefix(设置安装路径)
  --sbin-path=PATH                   set nginx binary pathname(设置nginx执行文件的路径和文件名称)
  --modules-path=PATH                set modules path(设置模块路径)
  --conf-path=PATH                   set nginx.conf pathname(设置nginx配置文件的路径和文件名称)
  --error-log-path=PATH              set error log pathname(设置错误日志文件的路径和文件名称)
  --pid-path=PATH                    set nginx.pid pathname(设置nginx.pid进程文件的路径)
  --lock-path=PATH                   set nginx.lock pathname(设置nginx.lock锁文件的路径)

  --user=USER                        set non-privileged user for
                                     worker processes(指定linux用户)
  --group=GROUP                      set non-privileged group for
                                     worker processes(指定linux组)

  --build=NAME                       set build name 
  --builddir=DIR                     set build directory

  # 功能模块,without表示默认安装的功能模块(你想要去掉他可以使用without去掉),with表示可选择安装的功能模块,不是默认的(你想用它可以使用with去安装)
  --with-select_module               enable select module
  --without-select_module            disable select module
  --with-poll_module                 enable poll module
  --without-poll_module              disable poll module

  --with-threads                     enable thread pool support

  --with-file-aio                    enable file AIO support

  --with-http_ssl_module             enable ngx_http_ssl_module
  --with-http_v2_module              enable ngx_http_v2_module
  --with-http_realip_module          enable ngx_http_realip_module
  --with-http_addition_module        enable ngx_http_addition_module
  --with-http_xslt_module            enable ngx_http_xslt_module
  --with-http_xslt_module=dynamic    enable dynamic ngx_http_xslt_module
  --with-http_image_filter_module    enable ngx_http_image_filter_module
  --with-http_image_filter_module=dynamic
                                     enable dynamic ngx_http_image_filter_module
  --with-http_geoip_module           enable ngx_http_geoip_module
  --with-http_geoip_module=dynamic   enable dynamic ngx_http_geoip_module
  --with-http_sub_module             enable ngx_http_sub_module
  --with-http_dav_module             enable ngx_http_dav_module
  --with-http_flv_module             enable ngx_http_flv_module(流媒体)
  --with-http_mp4_module             enable ngx_http_mp4_module
  --with-http_gunzip_module          enable ngx_http_gunzip_module
  --with-http_gzip_static_module     enable ngx_http_gzip_static_module(压缩功能)
  --with-http_auth_request_module    enable ngx_http_auth_request_module
  --with-http_random_index_module    enable ngx_http_random_index_module
  --with-http_secure_link_module     enable ngx_http_secure_link_module
  --with-http_degradation_module     enable ngx_http_degradation_module
  --with-http_slice_module           enable ngx_http_slice_module
  --with-http_stub_status_module     enable ngx_http_stub_status_module(启用http状态查询功能)

  --without-http_charset_module      disable ngx_http_charset_module
  --without-http_gzip_module         disable ngx_http_gzip_module
  --without-http_ssi_module          disable ngx_http_ssi_module
  --without-http_userid_module       disable ngx_http_userid_module
  --without-http_access_module       disable ngx_http_access_module
  --without-http_auth_basic_module   disable ngx_http_auth_basic_module
  --without-http_mirror_module       disable ngx_http_mirror_module
  --without-http_autoindex_module    disable ngx_http_autoindex_module
  --without-http_geo_module          disable ngx_http_geo_module
  --without-http_map_module          disable ngx_http_map_module
  --without-http_split_clients_module disable ngx_http_split_clients_module
  --without-http_referer_module      disable ngx_http_referer_module
  --without-http_rewrite_module      disable ngx_http_rewrite_module
  --without-http_proxy_module        disable ngx_http_proxy_module
  --without-http_fastcgi_module      disable ngx_http_fastcgi_module
  --without-http_uwsgi_module        disable ngx_http_uwsgi_module
  --without-http_scgi_module         disable ngx_http_scgi_module
  --without-http_grpc_module         disable ngx_http_grpc_module
  --without-http_memcached_module    disable ngx_http_memcached_module
  --without-http_limit_conn_module   disable ngx_http_limit_conn_module
  --without-http_limit_req_module    disable ngx_http_limit_req_module
  --without-http_empty_gif_module    disable ngx_http_empty_gif_module
  --without-http_browser_module      disable ngx_http_browser_module
  --without-http_upstream_hash_module
                                     disable ngx_http_upstream_hash_module
  --without-http_upstream_ip_hash_module
                                     disable ngx_http_upstream_ip_hash_module
  --without-http_upstream_least_conn_module
                                     disable ngx_http_upstream_least_conn_module
  --without-http_upstream_random_module
                                     disable ngx_http_upstream_random_module
  --without-http_upstream_keepalive_module
                                     disable ngx_http_upstream_keepalive_module
  --without-http_upstream_zone_module
                                     disable ngx_http_upstream_zone_module

  --with-http_perl_module            enable ngx_http_perl_module
  --with-http_perl_module=dynamic    enable dynamic ngx_http_perl_module
  --with-perl_modules_path=PATH      set Perl modules path
  --with-perl=PATH                   set perl binary pathname

  --http-log-path=PATH               set http access log pathname
  --http-client-body-temp-path=PATH  set path to store
                                     http client request body temporary files
  --http-proxy-temp-path=PATH        set path to store
                                     http proxy temporary files(设置代理的临时目录)
  --http-fastcgi-temp-path=PATH      set path to store
                                     http fastcgi temporary files
  --http-uwsgi-temp-path=PATH        set path to store
                                     http uwsgi temporary files
  --http-scgi-temp-path=PATH         set path to store
                                     http scgi temporary files

  --without-http                     disable HTTP server
  --without-http-cache               disable HTTP cache

  --with-mail                        enable POP3/IMAP4/SMTP proxy module
  --with-mail=dynamic                enable dynamic POP3/IMAP4/SMTP proxy module
  --with-mail_ssl_module             enable ngx_mail_ssl_module
  --without-mail_pop3_module         disable ngx_mail_pop3_module
  --without-mail_imap_module         disable ngx_mail_imap_module
  --without-mail_smtp_module         disable ngx_mail_smtp_module

  --with-stream                      enable TCP/UDP proxy module
  --with-stream=dynamic              enable dynamic TCP/UDP proxy module
  --with-stream_ssl_module           enable ngx_stream_ssl_module
  --with-stream_realip_module        enable ngx_stream_realip_module
  --with-stream_geoip_module         enable ngx_stream_geoip_module
  --with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module
  --with-stream_ssl_preread_module   enable ngx_stream_ssl_preread_module
  --without-stream_limit_conn_module disable ngx_stream_limit_conn_module
  --without-stream_access_module     disable ngx_stream_access_module
  --without-stream_geo_module        disable ngx_stream_geo_module
  --without-stream_map_module        disable ngx_stream_map_module
  --without-stream_split_clients_module
                                     disable ngx_stream_split_clients_module
  --without-stream_return_module     disable ngx_stream_return_module
  --without-stream_upstream_hash_module
                                     disable ngx_stream_upstream_hash_module
  --without-stream_upstream_least_conn_module
                                     disable ngx_stream_upstream_least_conn_module
  --without-stream_upstream_random_module
                                     disable ngx_stream_upstream_random_module
  --without-stream_upstream_zone_module
                                     disable ngx_stream_upstream_zone_module

  --with-google_perftools_module     enable ngx_google_perftools_module
  --with-cpp_test_module             enable ngx_cpp_test_module

  --add-module=PATH                  enable external module
  --add-dynamic-module=PATH          enable dynamic external module

  --with-compat                      dynamic modules compatibility

  --with-cc=PATH                     set C compiler pathname
  --with-cpp=PATH                    set C preprocessor pathname
  --with-cc-opt=OPTIONS              set additional C compiler options
  --with-ld-opt=OPTIONS              set additional linker options
  --with-cpu-opt=CPU                 build for the specified CPU, valid values:
                                     pentium, pentiumpro, pentium3, pentium4,
                                     athlon, opteron, sparc32, sparc64, ppc64

  --without-pcre                     disable PCRE library usage
  --with-pcre                        force PCRE library usage
  --with-pcre=DIR                    set path to PCRE library sources
  --with-pcre-opt=OPTIONS            set additional build options for PCRE
  --with-pcre-jit                    build PCRE with JIT compilation support

  --with-zlib=DIR                    set path to zlib library sources
  --with-zlib-opt=OPTIONS            set additional build options for zlib
  --with-zlib-asm=CPU                use zlib assembler sources optimized
                                     for the specified CPU, valid values:
                                     pentium, pentiumpro

  --with-libatomic                   force libatomic_ops library usage
  --with-libatomic=DIR               set path to libatomic_ops library sources

  --with-openssl=DIR                 set path to OpenSSL library sources
  --with-openssl-opt=OPTIONS         set additional build options for OpenSSL

  --with-debug                       enable debug logging

nginx启动

#1. 到nginx的安装目录
[root@Centos100 nginx-1.18.0]# cd /software/nginx/nginx/sbin
#2. 启动nginx
[root@Centos100 sbin]# ./nginx -c ../conf/nginx.conf
#3. 查看nginx进程
[root@Centos100 sbin]# ps aux | grep nginx
root     13240  0.0  0.1  45984  1124 ?        Ss   16:35   0:00 nginx: master process ./nginx -c nginx-conf.conf
root     13241  0.0  0.1  46424  1888 ?        S    16:35   0:00 nginx: worker process
root     13243  0.0  0.0 112828   968 pts/0    S+   16:35   0:00 grep --color=auto nginx
#4. 查看80端口
[root@Centos100 sbin]# netstat -tulnp | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13240/nginx: master
#5. 关闭nginx进程
[root@Centos100 sbin]# kill -9 13240
#6. 重启nginx进程
[root@Centos100 sbin]# kill -1 13240
#7. 检测配置文件语法
[root@Centos100 sbin]# ./nginx -t -c nginx-conf.conf

启动成功后在页面输入ip直接访问查看
dsg_16 nginx

nginx配置

#user  nobody;
#1. 配置nginx工作进程数,nginx推荐有几个cpu,就配置几个进程
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

#2. 设置并发的最大连接数
events {
    worker_connections  1024;
}

#3. http服务配置
http {
#4. http服务全局配置
    include       mime.types;
    default_type  application/octet-stream;
	
	# 定义日志格式,和代表这个格式的名称,后面是日志格式:请求地址-请求用户[请求时间] "request" 请求状态码
    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  logs/access.log  main;
	#开启缓存,不用每次去应用程序里拿数据
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    #保持连接存活时间:65秒
    keepalive_timeout  65;
	#是否启用压缩功能,默认关闭
    gzip  on;
#4. server服务配置,一个http服务下面可以配置多个server服务
    server {
    	#监听端口,后面加default_server表示为默认服务
        listen       80 default_server;
        #配置服务名称,多个服务名称用空格隔开
        server_name  localhost;

        #charset koi8-r;

		#设置日志路径,注意路径是绝对路径,跟root设置路径不一样
		#access_log记录所有日志,并且按照设置的日志格式来记录日志
        access_log /software/nginx/nginx/software/nginx/nginx/applicationLog/80AccessLogs.log  main;
        #error_log记录设置的级别的日志,nginx有“stderr”, “emerg”, “alert”, “crit”, “error”,”warn”, “notice”, “info”, “debug”这几种级别,每次只能取其中一个
        error_log /software/nginx/nginx/software/nginx/nginx/applicationLog/80ErrorLogs.log  warn;
		

#5. 一个server里面可以定义多个location
        location / {
        	#配置web应用所在的目录,该目录以nginx的安装目录开始计算,root也可以写到server里面去
            root   html;
            #配置默认访问的文件
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        # 访问出错,500,502,503,504跳的页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

	#加密
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

查看服务器cpu个数

# 查看cpu
[root@Centos100 sbin]# cat /proc/cpuinfo
cpu cores	: 2

location的配置

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

#只匹配 / 的请求
location = / {
}

#只匹配以 / 开始的请求
location / {
}

#只匹配以 /images/ 开始的请求,并停止搜素,不检查正则表达式
location ^~ /images/ {
}

#匹配任何以gif或者jpg或者jpeg结尾的请求,$表示以某某某为结尾的标识
location ~* \.(gif|jpg|jpeg)${
}
  • = 精确匹配
  • ~ 区分大小写
  • ~* 不区分大小写
  • ^~ 禁止表达式匹配

匹配规则: location匹配的优先级是选择更加精确的匹配,比如上面例子里最后两个,图片请求如果是以images开头并且是jpg结尾,那他会匹配前面一个请求,而不会匹配后面请求,因为前面的以images开头的请求范围更小,更加精确

自定义错误页面

#server里面定义
#当访问出现500,502,503,504的状态码时,他会给你重定向到http://Centos100/50x.html,这时候根据请求他就会匹配到下面的location然后进入我们的自定义错误页面
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   html;
}

配置索引文件

location = /data {
	root file;
	autoindex on;
}

创建链接

有的文件路径太长,会造成访问链接太长,为了便于访问,可以使用以下方法设置

location /image {
	#这里是绝对路径,不是从nginx安装目录开始计算,跟root设置不一样
	alias /software/nginx/nginx/file/data/bb;
}

控制站点访问

location /image {
	alias /software/nginx/nginx/file/data/bb;
	allow 192.168.113.1;
	deny 192.168.113.2;
	deny all;
}

控制站点的优先级是按照顺序来的,也就是说如果在前面允许了该ip地址访问,那么即使下面有设置拒绝该ip访问的,这个ip还是可以访问这个链接的,而默认情况下是全部都允许的,所以我们在最后加上deny all可以屏蔽所有除了上面允许访问的ip,保证系统的最大安全性。

身份验证

ngx_http_auth_basic_module模块实现访问必须输入用户名和密码

#a. 安装htpasswd
#查看是否安装了htpasswd
[root@Centos100 nginx]# yum list installed | grep httpd-tools
httpd-tools.x86_64                    2.4.6-97.el7.centos              @updates
# 如果没有,安装
[root@Centos100 nginx]# yum install -y httpd-tools
#b. 生成用户密码文件htpasswd.users,并添加用admin和密码1;参数b:添加用户,c:生成用户密码文件
[root@Centos100 nginx]# htpasswd -bc /software/nginx/nginx/file/users/htpasswd.users admin 1
#c. 添加新用户zhangsan,密码1;参数b:添加用;如果添加已经存在的用户,则是修改密码
[root@Centos100 nginx]# htpasswd -b /software/nginx/nginx/file/users/htpasswd.users zhangsan 1
#d. 删除用户;参数D:删除用户
[root@Centos100 nginx]# htpasswd -D /software/nginx/nginx/file/users/htpasswd.users zhangsan
#e. 修改nginx配置文件
location /image {
	alias /software/nginx/nginx/file/data/bb;
	#这两个属性也可以配置到server中去,控制全局
	auth_basic "Restricted Access";
    auth_basic_user_file /software/nginx/nginx/file/users/htpasswd.users;
	allow 192.168.113.1;
	deny 192.168.113.2;
	deny all;
}

nginx状态监测

http_stub_status_module模块可以实现nginx的状态监测

#状态监测,nginx_status这个目录可以不存在,并且可以不用指定root
location /nginx_status {
	#开启状态监测
	stub_status on;
	#关闭访问这个链接的日志输出
	access_log off;
}

dsg_16 nginx

nginx地址重写

nginx 预定义的变量

变量名称 含义
$arg_PARAMETER 这个变量值为:GET请求中变量名PARAMETER参数的值。
$args 这个变量等于GET请求中的参数。例如,foo=123&bar=blahblah;这个变量只可以被修改
$binary_remote_addr 二进制码形式的客户端地址。
$body_bytes_sent 传送页面的字节数
$content_length 请求头中的Content-length字段。
$content_type 请求头中的Content-Type字段。
$cookie_COOKIE cookie COOKIE的值。
$document_root 当前请求在root指令中指定的值。
$document_uri 与$uri相同。
$host 请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称(处理请求的server的server_name指令的值)。值为小写,不包含端口。
hostname 机器名使用 gethostname系统调用的值
$http_HEADER HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值), $http_referer…;
$sent_http_HEADER HTTP响应头中的内容,HEADER为HTTP响应中的内容转为小写,-变为_(破折号变为下划线),例如: $sent_http_cache_control, $sent_http_content_type…;
$is_args 如果$args设置,值为"?",否则为""。
$limit_rate 这个变量可以限制连接速率。
$nginx_version 当前运行的nginx版本号。
$query_string 与$args相同。
$remote_addr 客户端的IP地址。
$remote_port 客户端的端口。
$remote_user 已经经过Auth Basic Module验证的用户名。
$request_filename 当前连接请求的文件路径,由root或alias指令与URI请求生成。
$request_body 这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。
$request_body_file 客户端请求主体信息的临时文件名。
$request_completion 如果请求成功,设为"OK";如果请求未完成或者不是一系列请求中最后一部分则设为空。
$request_method 这个变量是客户端请求的动作,通常为GET或POST。
$request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。
$scheme 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。
$server_name 服务器名称。
$server_port 请求到达服务器的端口号。
$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$uri 请求中的当前URI(不带请求参数,参数位于 a r g s ) , 不 同 于 浏 览 器 传 递 的 args),不同于浏览器传递的 args),不同于浏览器传递的request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html

if 指令

#如果请求的浏览器是MSIE,那么就重写地址
#注意:if和(之间要有空格
if ($http_user_agent ~ MSIE){
	#^:以某某某开始;.:一个字符;.*:任意字符串;$:以某某某结尾
	#break:rewrite的flag标记
	#将^(.*)$匹配的uri转向/msie/$1链接上去
	rewrite ^(.*)$ /msie/$1 break;
}

#如果请求找不到这个文件,那么就重写地址
if (!-f $request_filename){
	#将^/img/(.*)$匹配的uri转到/site/$host/images/$1目录下
	#last rewrite的flag标记
	rewrite ^/img/(.*)$ /site/$host/images/$1 last;
}

set、rewrite指令

#如果请求地址是以任意字符开头,以.aaa.com结尾,不区分大小写,设置变量var_tz=1
if($host ~* ^(.*?)\.aaa\.com$){
	set $var_tz '1';
}
#如果请求地址是以192.168.1.开头,以任意字符结尾的,不区分大小写,设置变量var_tz=1
if($host ~* ^192\.168\.1\.(.*?)$){
	set $var_tz '1';
}
#如果请求地址是以localhost开头的,设置变量var_tz=1
if($host ~* ^localhost){
	set $var_tz '1';
}
#如果变量var_tz不等于'1',区分大小写,则重写地址到http://www.aaa.com/,并设置rewrite的flag标记为redirect
if($var_tz !~ '1'){
	rewrite ^/(.*)$ http://www.aaa.com/ redirect;
}

rewrite指令flag标记

  • last:实现uri重写,浏览器url地址栏不变,还会继续匹配后面的规则
  • break:实现uri重写,浏览器url地址栏不变,并且不再匹配后面的规则
  • redirect:实现uri重写,浏览器url地址栏显示跳转的地址,并且请求返回状态码302临时重定向
  • permanent:实现uri重写,浏览器url地址栏显示跳转的地址,并且请求返回状态码301永久重定向

注意:一般精确匹配的用break标记,在大范围比如在service或者localtion / {}匹配的用last
demo:

	#1. 将要访问的data目录重写到bbs上去
	location /data {
	    root file;
	    autoindex on;
	    rewrite ^/data/?$ /bbs/ permanent;
	}

	location /bbs {
	    root file;
	    autoindex on;
	}
	#2. 根据不同的浏览器得到不同的结果
	root /software/nginx/nginx/file;
	if ( $http_user_agent ~ MSIE ){
         rewrite ^(.*)$ /msie/$1 break;
    }
    if ( $http_user_agent ~ Chrome ){
         rewrite ^(.*)$ /chrome/$1 break;
    }

反向代理

server {
	listen 90;
	server_name localhost;
	location / {
		#在地址后面加个斜杠,这样请求的/后面的uri就会拼到自定义的服务后面去
	   proxy_pass http://centos101:8080/;
	}
}

代理kafka服务

#如果没有stream模块,则需要给nginx添加stream模块
[root@localhost nginx-1.12.2]# ./configure --with-stream
[root@localhost nginx-1.12.2]# make & make install

#修改配置文件
stream{
	#需要代理的kafka集群
    upstream brokers{
        server 192.168.4.31:18001;
        server 192.168.4.65:18001;
        server 192.168.4.68:18001;
    }
    server{
    	#指定端口
        listen 18001;
        proxy_pass brokers;
    }
}

负载均衡

http{
	#自定义服务使用upstream定义,并且要在http下面定义
	upstream myServer {
		#weight:权重;max_fails:最大失败次数;fail_timeout:超时时间
		server centos101:8080 weight=1 max_fails=2 fail_timeout=30s;
		server centos102:8080 weight=2 max_fails=2 fail_timeout=30s;
   	}
   	server {
		listen 90;
		server_name localhost;
		location /demo {
			#在地址后面加个斜杠,这样请求的demo后面的uri就会拼到自定义的服务后面去
		   proxy_pass http://myServer/demo/;
		}
	}
}

nginx日志管理

log_format指令用来设置日志的记录格式,语法如下:

log_format name 'format'
#具体日志格式如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';
#$remote_addr用于记录ip地址
#$remote_user用来记录远程客户端用户名称
#$time_local用来记录访问时间及时区
#$request用于记录请求的URL与HTTP协议
#$status用于记录请求的状态,例如成功时状态为200,页面找不到时为404$body_bytes_sent用于记录发送给客户端的文件主体内容大小
#$body_bytes_sent用于记录传送页面的字节数
#$http_referer用于记录是从哪个页面链接访问过来的
#$http_user_agent用于记录客户端浏览器的相关信息

#日志
192.168.113.1 - - [30/Jan/2021:22:58:56 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "-"

限速设置

location /data {
	root file;
	#当他下载达到20m的时候限速
	limit_rate_after 20m; 
	#限速128kb/s
	limit_rate 128k;
}
上一篇:编译nginx时openssl报错的解决方案


下一篇:nginx lua阶段处理流程