Nginx配置与使用

Nginx是一款基于C语言开发的轻量级开源Web服务器软件,可作为反向代理、负载均衡、缓存服务器使用。

Nginx最初的设计是成为一个HTTP服务器,一个能够解决C10K问题的HTTP服务器。设计一个同时连接处理1w连接的web服务器,为了实现这个目标,Nginx通过基于事件的处理机制配置操作系统相应的事件机制,便可以解决C10K问题。

由于Nginx使用基于事件驱动的架构能够并发出发百万级别的TCP连接,高度模块化的设计和自由的许可证使得扩展Nginx功能的第三方模块层出不穷。

对于高效处理大规模并发连接,Nginx支持Linux的epoll、Solaris的event ports、FreeBSD的kqueue等。

对于Linux,Nginx支持其独有的sendfile系统调用,可高效地把硬盘中的数据发送到网络上,无需先将硬盘数据复制到用户内存上后发送,这极大地减少了内核与用户态数据间的复制动作。

Nginx竞争对手包括 Apache、Lighttpd、Tomcat、Jetty、IIS...

Apache发展时间长且作为世界第一大web服务器,由于它兴起时互联网产业规模远不如现在,所以被设计成一个重量级且不支持高并发的web服务器。在Apache上,如果有数以万计的并发HTTP请求同时访问,会直接导致服务器上消耗大量内存,操作系统内核对成百上千的Apache进程做进程间切换,消耗大量CPU资源,并导致HTTP请求的平均响应速度降低,这些都决定了Apache不可能成为高性能web服务器,也促使Lighttpd和Nginx的出现。

Nginx和Lightttp都是为高并发应用场景而设计的,Nginx具有性能高、稳定性好、结构模块化、配置简单、资源消耗低等优点。实际上,Nginx已经成为业界高性能Web服务器的代名词。

为什么选择Nginx呢

  1. 更快速
    正常情况下,单次请求会得到更快的响应,其次在高峰期,Nginx比其他Web服务器更快地响应请求。
  2. 高扩张
    Nginx的设计极具扩展性,它由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。
    Nginx模块都是嵌入到二进制文件中执行的,无论官方还是第三方均如此。
  3. 高可靠
    Nginx的高可靠性来自其核心框架代码的优秀设计、模块设计的简单性。
  4. 低内存
    一般1w个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。
    5.单机支持10w+并发连接
    理论上Nginx支持的并发连接上限取决于内存
  5. 热部署
    Nginx的master管理进程和worker工作进程的分离设计,使得Nginx能够提供热部署功能。

选择Nginx的核心理由是它能支持高并发请求的同时保持高效的服务。


备注:Web/WWW服务器基本功能

  • 基于REST架构风格
  • 以统一资源描述符URI或统一资源定位符URL作为沟通依据
  • 通过HTTP为浏览器等客户端程序提供网络服务

Nginx应用场景

并发处理

  • Tomcat 200
  • Nginx 5W

反向代理

反向代理指以代理服务器来接收Internet上的连接请求,然后将请求转发给内网服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外表现为一个服务器。

反向代理服务器可作为内容服务器的替身,也可以作为内容服务器集群的负载均衡器。

安装配置

安装必备的库

  • GCC
    由于Nginx是使用C语言开发的,所以需要安装C语言编译器。
  • PCRE
    PCRE是Perl库,包括了Perl兼容的正则表达式,Nginx的HTTP模块使用的是PCRE来解析正则。
  • ZLIB
    zlib是压缩和解压的库,Ngnix使用的gzip对HTTP包进行压缩和解压。

下载解压安装

Ubuntu使用sudo apt-get install nginx命令安装,安装完成后/usr/sbinnginx命令所在,/etc/nginx目录是nginx配置文件。

$ sudo apt-get install nginx
$ wget 
$ tar -zxvf nginx.tar.gz
$ cd nginx

# 指定安装位置,然后编译安装。
$ ./configure --prefix=/usr/local/nginx
$ make && make install
$ cd /usr/local/nginx/sbin

# 指定配置启动Nginx
$ ./nginx -c /usr/local/nginx/conf/nginx.conf

# 关闭Nginx,会像查出pid然后再kill进程,会存在丢包的问题。
$ ./nginx -s stop

# 完整关闭 优雅退出
$ ./nginx -s quit

查看Nginx进程是否启动

$ ps -ef | grep nginx

Nginx进程启动时,会附带一个守护进程,用于保护正式进程不被异常终止,如果守护进程一旦返现,Nginx继承将被终止,会自动重启该进程。守护进程一般称为master进程,业务进程被称为worker进程。

停止Nginx

# 强行停止Nginx服务器,当前若有尚未处理完毕的数据则丢弃。
$ nginx -s stop

# 优雅的停止Nginx服务器,当前若有尚处理完毕的数据,等待处理完成后停止Nginx。
$ nginx -s quit

配置文件


#*************************main:Nginx全局配置************************#
#指定工作进程运行的用户或组,默认nobody nobody。
#user  nobody;

#工作进程数量:指定Nginx开启子进程的数量,运行过程中监控每个进程消耗内存,通常数量是CPU内核数量的整数倍。
worker_processes  1;

#错误日志输出级别与保存路径,级别为debug|info|notice|warn|error|crit|alert|emerg。
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#Nginx进程运行文件存放位置
#pid        logs/nginx.pid;

#指定单一进程可以打开最多文件数量的描述
#worker_rlimit_nofile 1024;


#*************************event:Nginx工作模式************************#
#Nginx服务器和用户网络连接
events {
    #工作进程最大连接数:最大可同时接收的连接数量,最大连接数是和worker processes共同决定的。
    worker_connections  1024;
    
    #网络连接序列化,防止惊群现象发生,默认on。
    #accept_mutex on;
    
    #单一进程是否可以同时接受多个网络连接,默认off。
    #multi_accept on;
    
    #事件驱动模型:配置线程轮询方式 select|poll|kqueue|epoll|resing|/dev/poll|eventport
    #use epoll;
}

#*************************http:HTTP协议信息配置************************#
#HTTP协议配置
http {
    #文件扩展名与文件类型映射表
    include       mime.types;
    #默认文件类型,默认text/plain。
    default_type  application/octet-stream;
    #是否开启服务日志
    #access_log off;
    #日志自定义格式
    #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方式传输文件,默认off。将文件的回写过程交给数据缓存区完成,而不是放在应用中完成,可提高性能。
    sendfile        on;
    #tcp_nopush     on;
    #链接超时时间,默认75秒。
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #是否开启内容压缩
    #gzip  on;
    #虚拟主机
    server {
        #监听端口
        listen       8000;
        #监听地址
        server_name  localhost;
        #字符集类型
        #charset koi8-r;
        #日志路径与格式
        #access_log  logs/host.access.log  main;
        #路由正则匹配: ~区分大小写 ~*区分大小写
        location / {
            #根目录
            root   html;
            #默认页
            index  index.html index.htm;
            #请求转发
            #proxy_pass http://svr
            #拒绝IP
            #deny 1272.0.0.1;
            #允许IP
            #allow 192.168.0.164;
        }
        #错误页
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        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;
    #    }
    #}

}

猜你喜欢

转载自blog.csdn.net/weixin_33895604/article/details/87536013
今日推荐