nginx 基础
发布日期:2021-05-09 05:38:32 浏览次数:19 分类:原创文章

本文共 14853 字,大约阅读时间需要 49 分钟。

 web服务器,主要用作静态资源服务器及反向代理服务器:

        nignx使用需要优化的配置点主要包括如下:

  1. worker_processes 工作进程数,nginx包括一个主进程和多个工作进程,主进程负责读取和验证配置,维护工作进程;工作进程负责处理用户请求。nginx使用一种基于事件,独立于操作系统的机制来高校的想工作进程分发用户请求。worker_processes 可以设置固定的某个数字,或者设置为 auto 自动发现服务器核心数并设置。一般建议设置为<=服务器核心数。nginx单进程处理请求数已经非常可观。如果设置数超过服务器核心数,不必要的上下文切换,也可能反而引起整体处理能力的下降。
  2. worker_cpu_affinity 设置cpu亲和性,将工作进程和cpu进行绑定。结合1进行使用。使用可用cpu数掩码配置。如
    worker_processes    4;worker_cpu_affinity 0001 0010 0100 1000;
  3. worker_connections 一个工作进程可处理的连接数,包括所有类型的连接(包括客户端,代理服务器等之间的连接)。
  4. 每一个服务器请求都会需要一个相应的文件句柄,涉及到服务器最大句柄数的限制,因此需要进行相应的服务器配置。
  5. 打开缓存
  6. 设置日志级别
  7. 使用压缩,包括设置压缩方法,策略,内容类型
  8. tcp连接复用。
  9. 。。。

nginx安装:

下载地址:http://nginx.org/en/download.html

下载解压:

./configure 编译构建

 

nginx:操作命令

nginx -s stop:快速停止

nginx -s quit:优雅停止,工作线程完成工作,以启动nginx的用户关闭;同系统命令:kill -s QUIT pid

nginx -s reload:重新加载配置文件,主进程接到重载配置文件信号,检查配置文件合法性,并尝试应用配置。应用成功后,启动新的工作进程,并向就的工作进程发送关闭进程的信号;应用配置失败,则回滚变化,继续使用旧的配置文件。旧的进程接到关闭的命令时,停吃接受新的请求,并继续服务当前请求直至结束,然后停止服务。

nginx -s  reopen:重新打开日志文件

 

nginx开启后主机无法访问虚拟机的nginx解决方案

1. ping虚拟机,判断是否防火墙问题

防火墙问题处理: iptables文件添加 -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

直接编辑文件:

vi /etc/sysconfig/iptables

命令处理:

[root@localhost ]# /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT[root@localhost ]# /etc/init.d/iptables save[root@localhost ]# /etc/init.d/iptables restart

centos iptables 防火墙:

禁用防火墙:systemctl disable firewalld

卸载防火墙:yum remove firewalld -y

 

使用下面的办法来恢复原来的习惯,同时解决iptables开机启动的问题。

yum install iptables-services -ysystemctl enable iptables

iptables服务会开机启动,自动从/etc/sysconfig/iptables 文件导入规则。

 

为了让/etc/init.d/iptables save 这条命令生效,执行如下:

cp /usr/libexec/iptables/iptables.init /etc/init.d/iptables

 

nginx代理服务器设置:

server {    location / {        proxy_pass http://localhost:8080/; //80端口下访问,除了特别定义的location,其它都转发给8080端口处理        #开启反向代理缓存,并使用zone name为one的缓存。        proxy_cache one;        #设置状态码为200 302过期时间为10分钟        proxy_cache_valid  200 302  10m;        #设置状态码404的过期时间为1分钟        proxy_cache_valid  404      1m;    }     location ~ \.(gif|jpg|png)$ {        root /data/images;    }}

nginx反向代理问题:

]:8080 failed (13: Permission denied) while connecting to upstream,

处理: SeLinux

一、关闭SeLinux

查看SELinux状态:

>/usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态SELinux status:                 enabled>getenforce                 ##也可以用这个命令检查

关闭SELinux

1、临时关闭(不用重启机器):

setenforce 0                  ##设置SELinux 成为permissive模式

##setenforce 1 设置SELinux 成为enforcing模式

2、修改配置文件需要重启机器:

修改/etc/selinux/config 文件

将SELINUX=enforcing改为SELINUX=disabled

重启机器即可

 

二、执行下面的命令

setsebool -P httpd_can_network_connect 1

连接处理方法配置:

--with-select_module:配置使用select

--with-poll_module:配置使用poll

linux2.6+:epoll

 

查看nginx 配置信息:安装使用配置--

[root@zookeeper nginx]# nginx -Vnginx version: nginx/1.12.2built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)built with OpenSSL 1.0.2k-fips  26 Jan 2017TLS SNI support enabled

nginx安装配置:

configure arguments: 
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi \
--pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx \
--user=nginx --group=nginx \
--with-file-aio --with-ipv6 \
--with-http_auth_request_module \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-pcre --with-pcre-jit \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-google_perftools_module \
--with-debug \
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'

 

 

配置日志级别:

error_log /var/log/nginx/error.log debug;   // debug,info,notice,warn,error,crit, or alert

测试配置文件合法性:

nginx -t

负载均衡 loadblance

1、round-robin:轮询,可以配置权重,默认策略,服务器性能均衡,不可以直接配置

2、least-connected:least_conn、最少连接

3、ip-hash:ip作为hask key,选择服务器,保障统一客户端能请求总是到达同一服务器

4、hash $request_uri:按请求url hash值分配服务器

5、least_time:最少平均延迟和最少活跃连接。

负载均衡: (默认1,一次无回复,则nginx认定服务器down), (默认10s,nginx标记服务器下线后,经过时间间隔后认定服务器down), and 只对对服务器起作用

http{    ...    upstream upblance {            ip_hash;  // ip_hash | least_conn | least_time            server 192.168.126.128:8080 max_conns=2;    //round-robin策略下,可配置 weight=2,权重;max_conns服务器最大连接数,超过,则将请求置于请求队列,超过队列大小,则报错            server localhost:8080;   // 添加 backup 设置为备用服务器;添加down 暂时下线服务器;slow_start=30s慢启动,用户刚恢复的服务器;            queue 100 timeout=70; //1.15.12版本及之后        }    server{        ...                location /            {                proxy_pass http://upblance; //http必须            }

 

配置https server:可以使用openssl 生成相应的免费证书 server.key server.crt

server {        listen       443 ssl http2 default_server;        listen       [::]:443 ssl http2 default_server;        server_name  _;        root         /usr/share/nginx/html;        ssl_certificate "server.crt";        ssl_certificate_key "server.key";        ssl_session_cache shared:SSL:1m;        ssl_session_timeout  10m;        ssl_ciphers HIGH:!aNULL:!MD5;        ssl_prefer_server_ciphers on;         # Load configuration files for the default server block.        include /etc/nginx/default.d/*.conf;        location / {        }        error_page 404 /404.html;            location = /40x.html {        }        error_page 500 502 503 504 /50x.html;            location = /50x.html {        }    }

 

rewrite,重定向:定义一个新的server,重新指向

    server {        listen 80;        server_name test.com;        return 301 http://www.test.com$request_uri; //指向下面server    }    server {        listen       80 default_server;        listen       [::]:80 default_server;        server_name  www.test.com;        ... ...

 

服务名称定义:one should simply define , , and “everything else”:

server {    listen 80;    server_name example.comwww.example.com;    ...}server {    listen 80 default_server;    server_name _; //指代所有其它    return 301 http://example.com$request_uri;}

 

websocket:101 switch protocal      

        location /chat/        {            proxy_pass http://192.168.7.133:8888/websocket;            proxy_http_version 1.1;            proxy_set_header Upgrade $http_upgrade; //            proxy_set_header Connection "upgrade";  //        }

 

libxml2   +  libxml2-devel

 

fastcgi:网关转发请求

示例,处理php请求:linux安装php-fpm fastcgi软件

         location ~ \.php$        {            root html;            fastcgi_pass localhost:9000;            fastcgi_index index.php;            include fastcgi.conf; //必要的配置        }

 

session持久化:

upstream:ip_hash、hash、sticky。。。

 

四层协议的转发、代理或者负载均衡:stream模块,平行 http

stream {    upstream streamhost {       server 192.168.7.133:9090;    }    server{        listen 9090;        proxy_pass streamhost;        proxy_timeout 3s;        proxy_connect_timeout 1s;    }}

 

访问控制:

location / {    deny 192.168.1.1;    allow 192.168.1.0/24;    allow 10.1.1.0/16;    allow 2001:0db8::/32;    deny all;}location /{    proxy_pass http://upblance;    deny 192.168.126.1; // address | CIDR | unix: | all;deny: Denies access for the specified network or address;allow: Allows access for the specified network or address.}

 

重新载入nginx配置文件是报错:nginx: [error] invalid PID number "" in "/run/nginx.pid"

解决:重新制定配置文件位置,然后再载入配置文件

//检查配置文件nginx -c 路径/nginx.conf//重新加载nginx -s reloadnginx ssi: 。。。

 

with-http_addition_module:相应前后添加内容:

        location /        {            proxy_pass http://upblance;            #deny 192.168.126.1;            add_before_body /header/;            add_after_body /footer/;        }        location /header/        {            root /usr/share/nginx/html;        }        location /footer/        {            root /usr/share/nginx/html;        }

 

autoindex on:当请求资源目录下没有index时,自动展现目录下文件列表:

        location /autoindex/        {            autoindex on;            autoindex_exact_size on;            autoindex_localtime on;            root /usr/share/nginx/html;        }

 

random_index on: 随机返回请求资源目录下资源:

     location /randomindex/        {            random_index on;            root /usr/share/nginx/html;        }

 

gzip压缩:* ngx_http_gzip_module 实时压缩,每次读取资源压缩

    gzip on;   //启动压缩    gzip_min_length 1000; //需要压缩的最小长度,取自于 Content-Length”    gzip_comp_level 6; //压缩比率,越大耗费的cpu越多    gzip_proxied expired no-cache no-store private auth;  //根据请求和回复,决定是否启用代理压缩    gzip_types text/plain application/xml;  //针对压缩的资源类型    gzip_disable "MSIE [1-6]\.";  //根据客户端 User-Agent进行设置,MSIE[1-6]微软1-6版本浏览器,或者基于微软浏览器内核的浏览器;     //The special mask “msie6” (0.7.12) corresponds to the regular expression “MSIE [4-6]\.”, but works faster

 

 重写:

rewrite==ngx_http_rewrite_module:rewrite regex replacement [flag];rewrite /rewrite /; //路径包含rewrite的请求rewrite /rewrite / permanent; // permanent 创建永久重定向301规则,重定向新的url,(浏览器更新书签、爬虫更新抓取内容)rewrite ^/rewrite$ /; //严格的路径重定向rewrite /rewrite/(.*) http://www.$1.com;  //重定向路径包含http https,则直接重定向至replacement  url;/rewrite/baidu =》http://www.baidu.com

flag说明: 

last:停止当前指令集,搜索与更改后的URI匹配的location

brak:停止当前指令集

redirect:302临时重定向

permanent:301永久重定向

 

last 和 break一样 它们都会终止此 location 中其他它rewrite模块指令的执行,

但是 last 立即发起新一轮的 location 匹配 而 break 则不会。

 

* last – Stops execution of the rewrite directives in the current server or location context, but NGINX Plus searches for locations that match the rewritten URI, and any rewritedirectives in the new location are applied (meaning the URI can be changed again).

* break – Like the break directive, stops processing of rewrite directives in the current context and cancels the search for locations that match the new URI. The rewrite directives in the new location are not executed.

 

重新后之前的请求参数会附加到新的url之后;在新的url之后添加 ?, 则抛弃之前的参数。

GET /rewrite/baidu?time=time() =》()

 

log参数:

自定义log profile:

 

同时也可以针对不同的server定义不同的 error 和 access log

log_format test  '$remote_addr - [$time_local] "$request"  $status ';   //日志标识... ...server {    access_log /var/log/nginx/root.log test; //使用自定义的日志 profile}

 

log文件fd缓存:

http{  open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;  //缓存打开的日志文件描述符    ....

 

限流:ngx_http_limit_req_module

限制请求处理速率,尤其是源自同一ip的请求:基于漏桶方法

http {    limit_req_zone $binary_remote_addr zone=first:10m rate=1r/s; //定义 key为请求地址, zone名为first,容量为10m的共享内存区域(lru),处理速率限制为每秒1次。    limit_req_zone $server_name zone=perserver:10m rate=10r/s;  //定义key为服务器名称,zone为perserver,容量为10m的共享内存区域(lru),处理速率限制为每秒10次。    ...    server {        ...        location /search/ {            limit_req zone=first burst=5; //使用共享内存区域first,设定爆发请求数不超过5,如果不希望延迟过量的请求,则尾部添加nodelay标识            limit_req zone=perserver burst=10;  //多限制共存,并        }

如下:error log:

2018/07/20 03:03:40 [error] 9969#0: *714 limiting requests, excess: 5.213 by zone "first", client: 192.168.126.1, server: www.test.com, request: "GET / HTTP/1.1", host: "192.168.126.129"2018/07/20 03:03:40 [error] 9969#0: *714 limiting requests, excess: 5.013 by zone "first", client: 192.168.126.1, server: www.test.com, request: "GET / HTTP/1.1", host: "192.168.126.129"2018/07/20 03:03:41 [error] 9969#0: *715 limiting requests, excess: 5.037 by zone "first", client: 192.168.126.1, server: www.test.com, request: "GET / HTTP/1.1", host: "192.168.126.129

 

限制下载速率:

        location /randomindex/        {            random_index on;            root /usr/share/nginx/html;            limit_rate_after 1m; //下载1m后开始限速            limit_rate 100k; //限制下载速率为1k/s        }

 

鉴权ngx_http_auth_basic_module:用于保护特定url连接安全;针对不同的url可以生成不同的鉴权文件。

         location /        {            proxy_pass http://upblance;            #deny 192.168.126.1;            add_before_body /header/;            add_after_body /footer/;            limit_req zone=first burst=5;            auth_basic           "default n";            auth_basic_user_file /etc/nginx/htpasswd; //鉴权文件        }

 

使用httpd-tools生成鉴权文件:

[root@zookeeper nginx]# yum install httpd-tools //安装加密工具[root@zookeeper nginx]# htpasswd –c /etc/nginx/htpasswd roger //生成用户名为roger的密码,并存放于文件/etc/nginx/htpasswd 文件中[root@zookeeper nginx]# cat htpasswdroger:$apr1$c94VlRcs$fuU12rxXOVfxGNn8vGr8E  //文件格式

 

防盗链,安全连接:ngx_http_secure_link_module:

secure_link_secret:/prefix/hash/link        location /securelink/        {            root html;            secure_link_secret test_secure;  //用于检验请求连接,            if ($secure_link = "") { //如果请求连接包含权限验证信息,则真正的请求会从请求连接分离出来存入$scure_link,否则的话置空                return 403;            }            rewrite ^ /securelink/$secure_link break; //break 必要        }

 

生成MD5 HASH: 请求资源/secure.html

[root@zookeeper nginx]# echo -n 'secure.htmltest_secure' | openssl dgst -md5(stdin)= 6da8690e402cd3b50da5d751d13b4ea8

生成请求连接: /securelink/secure.html

http://192.168.126.129/securelink/6da8690e402cd3b50da5d751d13b4ea8/secure.html

 

secure_link、secure_link_md5:location /securelinkx        {            root html;            secure_link $arg_md5,$arg_expires; //参数 md5、expires            secure_link_md5 "$secure_link_expires$uri$remote_addr secure_test";  //secure_link_expires:用于内部获取expires;uri:请求路径;secure_test:添加的密参;remote_addr:注意获取的值;自选需要的参数            if ($secure_link = "") {                return 403;            }            if ($secure_link = "0") {                return 410;            }        }

请求路径:/securelinkx/

md5:

[root@zookeeper nginx]#  echo -n '2147483647/securelinkx/192.168.126.1 secure_test' |  openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =Qia1rWs8Xx2ZZkkJ7I4_IQ

请求连接:

http://192.168.126.129/securelinkx/?md5=Qia1rWs8Xx2ZZkkJ7I4_IQ&expires=2147483647

 

配置fastcgi wordpress:

        location /wordpress        {            root /var/www;            fastcgi_pass localhost:9000;            fastcgi_index index.php;            include fastcgi.conf;            include fastcgi_params;            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;        }

 

静态文件提前压缩: http_gzip_static_module,直接读取压缩的资源 .gz格式,

        location ~ \.(jpg|png|jpeg|bmp|gif|swf)$        {            gzip_static on;            root /usr/share/nginx/html/images;            expires 1d;        }

 

sub_filter: http_sub_module

location / {    sub_filter     'href="http://127.0.0.1:8080/'    'href="https://$host/';    sub_filter     'img src="http://127.0.0.1:8080/' 'img src="https://$host/';    sub_filter_once on;}

 

上一篇:java动态代理
下一篇:docker 一篇文章学习容器化

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年05月03日 13时47分00秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

elTable火狐浏览器换行 2025-03-29
15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29
2023年深信服、奇安信、360等大厂网络安全校招面试真题合集(附答案),让你面试轻松无压力! 2025-03-29
2024年全国程序员平均薪资排名:同样是程序员,为什么差这么多?零基础到精通,收藏这篇就够了 2025-03-29
0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏) 2025-03-29
100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了 2025-03-29
10个程序员可以接私活的平台 2025-03-29
10个运维拿来就用的 Shell 脚本,用了才知道有多爽,零基础入门到精通,收藏这一篇就够了 2025-03-29
10条sql语句优化的建议 2025-03-29
10款宝藏编程工具!新手必备,大牛强烈推荐! 从零基础到精通,收藏这篇就够了! 2025-03-29
10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了 2025-03-29
15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了! 2025-03-29
15个程序员常逛的宝藏网站!!从零基础到精通,收藏这篇就够了! 2025-03-29
1分钟学会在Linux下模拟网络延迟 2025-03-29
2023应届毕业生找不到工作很焦虑怎么办? 2025-03-29
2023最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了 2025-03-29
2024 年需要了解的顶级大数据工具(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29
2024 最新 Kali Linux 定制化魔改,完整版,添加常见60渗透工具,零基础入门到精通,收藏这篇就够了 2025-03-29
2024大模型行业应用十大典范案例集(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29
2024届秋招让我(985本硕)直接破防,感觉书读了这么久结果毫无意义,读书就只为了读书,我该怎么办? 2025-03-29