概述&安装

Nginx是一个轻量级的高性能Web服务器,提供HTTP代理、反向代理、负载均衡、缓存等功能,它是基于事件的异步IO的迸发模型。 安装

# ubuntu安装
$ sudo apt-get install nginx
# 编译安装
$ ./configue \
$ --user=nginx
$ --prefix=/etc/nginx
$ ... # 根据自己的需求配置
$ make
$ sudo make install

基本命令

# 启动,重启,停止
$ sudo service nginx start # or restart, stop
$ sudo /etc/init.d/nginx start # or restart, stop
# 让配置生效
$ sudo nginx -s reload
# 查看nginx进程情况
$ ps aux|grep nginx
# 查看nginx配置文件路径
$ sudo nginx -t

默认配置文件

# vim /etc/nginx/nginx.conf

user www-data [group]; #运行用户, 用户组
worker_processes auto; #启动进程,通常设置成和cpu的数量相等
error_log /var/log/nginx/error.log | stderr; #全局错误日志, 输出到标准错误输出
pid /run/nginx.pid; #nginx作为守护进程,需要在PID文件中保存当前运行程序的主进程号
include /etc/nginx/modules-enabled/*.conf; #指定配置或引入第三方配置

events {
    use epoll; #使用的模型,其他的有select, poll, kqueue等,epoll是多路复用IO的一种方式,能大大提高nginx性能
    worker_connections 768; #每个worker process可以同时开启的最大连接数
    # multi_accept on; #是否允许每个work process同时接收多个网络连接
    keepalive_timeout 60; #超时时间
    keepalive_requests number; #单连接请求数上限
}

http {

    ##
    # Basic Settings
    ##
    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与$http_x_forwarded_for用以记录客户端的ip地址,$remote_user:用来记录客户端用户名称,$time_local: 用来记录访问时间与时区,$request: 用来记录请求的url与http协议,$status:用来记录请求状态;成功是200,$body_bytes_sent :记录发送给客户端文件主体内容大小,$http_referer:用来记录从那个页面链接访问过来的,$http_user_agent:记录客户浏览器的相关信息;
    #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

    access_log /var/log/nginx/access.log main; #指定日记文件路径
    error_log /var/log/nginx/error.log ;

    sendfile on; #用于使用sendfile()传输文件,如果是下载类的应用,可设置off
    tcp_nopush on; #允许使用socket的TCP_CORK的选项,此选项仅在sendfile的时候使用
    tcp_nodelay on;
    keepalive_timeout 65; #连接超时时间
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types; #设定mine类型
    default_type application/octet-stream;

    client_header_buffer_size 4k; #客户端请求头部的缓冲区大小,根据系统的分页大小来设定
    large_client_header_buffers 8 128k; #最大缓冲区大小

    client_max_body_size 300m; #设定通过nginx上传文件的大小

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    ##
    # Gzip Settings
    ##

    gzip on; #开启gzip压缩

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf; #包含其他配置文件
    include /etc/nginx/sites-enabled/*;
}

普通配置

# vim /etc/nginx/conf.d/myweb.conf

server {
    listen       8088;
    server_name  123.456.789.101;
    access_log  /codesheep/webserver/server1/log/access.log;
    error_page  404  /404.html;

    # location 表示url路径
    location / {
        proxy_pass http://192.168.1.100:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #后端web服务器可以通过X-Forwarded-For获取用户真实IP
    }

    location /server1/location1 {
        root   /codesheep/webserver;
        index  index.server2-location1.htm;
    }

    location /server1/location2 {
        root   /codesheep/webserver;
        index  index.server2-location2.htm;
    }

    #部署静态文件
    location /share/ {
        alias /home/web/html/;
        index share.html;
    }

    #设定查看Nginx状态的地址
    location /NginxStatus {
        stub_status            on;
        access_log             on;
        auth_basic             "NginxStatus";
        auth_basic_user_file   conf/htpasswd;
    }

    #禁止访问 .htxxx 文件
    location ~ /\.ht {
        deny all;
    }
}

# 配置uwsgi
server {
    listen  80; 如有多个web应用,都是80端口监听
    server_name resume.itswcg.com; #地址
    location / {
        include      uwsgi_params;
        uwsgi_pass   127.0.0.1:8386;  # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
        uwsgi_param UWSGI_PYHOME /www/wwwroot/www.itswcg.site/venv; #指向虚拟环境目录
        uwsgi_param UWSGI_CHDIR  /www/wwwroot/www.itswcg.site; # 指向网站根目录
        uwsgi_param UWSGI_SCRIPT main:app; # 指定启动程序
    }
    location /static/ {
        root /www/wwwroot/www.itswcg.site/static;
        expires 24h;
        access_log off;
    }
}

负载均衡

# vim /etc/nginx/conf.d/myweb.conf

# nginx的upstream支持轮询(默认)、weight、is_hash、fair
upstream myweb {
    is_hash; #根据访问ip的hash结果分配
    server 127.0.0.1:8027 weight=5;
    server 127.0.0.1:8028 down;
    server 127.0.0.1:8029 backup; #前面的所有机器忙的时候,请求backup机器
    fair; #根据服务器的相应时间来分配
    # hash $request_uri; 根据url的hash来分配请求,如果采用,不能加weight等参数
    # hash_method crc32; 指定hash算法
}

upstream todo {
    server 127.0.0.1:8031;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server ; #ipv6only=on

    root /usr/share/nginx/html;
    index index.html index.htm;

    server_name myweb.com 123.456.789.101;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://myweb;

        # 其他设置
        client_max_body_size 10m;     #允许客户端请求的最大单文件字节数
        client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
        proxy_connect_timeout 90;     #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout 90;        #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size 4k;       #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers 4 32k;   #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
        proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    }

    location ^~ /todo/ {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://todo; # 这种写法要项目路径中也要有todo
    }

    location ^~ /todo/static {
        root /todo/static;
        expires 24h;
        access_log off;
    }

    # 二级目录映射不同的反向代理(php)
    location /docs/ {
       alias /var/www/eolinker/; # root是当前目录上一个目录,alias就是当前目录里的内容,alias目录后一定要有斜杠
       index index.php;

       location ~ \.php$ {
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME $request_filename;
           include        fastcgi_params;
        }
    }

    location /todo/ {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_redirect  off; # 改变代理的location,默认不要变
      proxy_pass http://todo/; # 这种写法要项目路径中不需要目录,但要加个斜杠,这个斜杠是一个关键,作用是不往后端传递todo这个路径
    }
}

参考

https://nginx.rails365.net/ https://www.v2ex.com/t/465840 https://blog.csdn.net/tjcyjd/article/details/50695922
https://www.cnblogs.com/xiaogangqq123/archive/2011/03/02/1969006.html
https://cloud.tencent.com/developer/article/1068674