HƯỚNG DẪN Cấu hình Nginx

Thảo luận trong 'KIẾN THỨC VPS/SERVER' bắt đầu bởi quyet1990, 31/10/16.

  1. quyet1990

    quyet1990 New Member

    Tham gia ngày:
    22/10/16
    Bài viết:
    220
    Đã được thích:
    0
    Nginx là một máy chủ web hiệu suất cao được thiết kế để cung cấp một lượng lớn các nội dung tĩnh một cách nhanh chóng với hiệu quả sử dụng tài nguyên hệ thống.
    Điểm mạnh Nginx là khả năng để phục vụ có hiệu quả các nội dung tĩnh, giống như plain HTML và các tập tin media.
    Tất cả các file cấu hình Nginx được đặt trong thư mục /etc/nginx/. Tập tin cấu hình chính là /etc/nginx/nginx.conf.

    Trước khi bạn bắt đầu
    Các phần sau đây bao gồm một vài khái niệm và các biện pháp bảo vệ cần được xem xét trước khi thực hiện bất kỳ thay đổi cấu hình Nginx của bạn.
    Sao chép tập tin cấu hình trước khi thay đổi
    Mã:
    cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
    Định kì sao lưu tập tin cấu hình nginx
    Mã:
    cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date "+%b_%d_%Y_%H.%M.%S")
    Bất kì khi nào bạn thay đổi cấu hình, bạn cần phải dùng lệnh này để load lại cấu hình đã thay đổi
    Mã:
    service nginx reload
    Giới thiệu về cú pháp
    Phần này giới thiệu một đoạn mã từ đầu của tập tin cấu hình mặc định, /etc/nginx/nginx.conf:
    Mã:
    user www-data;
    worker_processes 4;
    pid /run/nginx.pid;
    
    events {
    worker_connections 768;
    # multi_accept on;
    }
    
    Thông thường, bạn sẽ không cần phải thay đổi bất cứ điều gì trong phần đầu tiên này. Thay vào đó, chúng tôi sẽ sử dụng điều này như một cơ hội để giải thích cú pháp của tập tin cấu hình.
    • Tất cả những dòng có dấu # phía trước được gọi những dòng chú thích (comment). Các lập trình viên sử dụng comment để giải thích những khối lệnh dùng để làm, hoặc để lại ý kiến làm thế nào chỉnh sửa giá trị.
    • Ngoài ra, bạn cũng có thể thêm riêng những comment theo ý của mình. Bạn có thể cho đoạn mã đó được kích hoạt bằng cách loại bỏ các #.
    • Cài đặt bắt đầu với những tên biến và sau đó một đối số hay một loạt các đối số cách nhau bởi dấu cách. Tất cả các đoạn mã đều kết thúc với một dấu chấm phẩy ( ; ).
    • Một số thiết lập, giống như biến events ở trên, được bao trong một cặp dấu ngoặc ngọn ({}). Các dấu ngoặc nhọn có thể được lồng vào nhau cho nhiều khối lệnh, cần nhớ là khi đã mở ngoặc nhọn thì phải nhớ đóng lại nếu không sẽ dẫn tới nginx không chạy được.
    • Sử dụng tab hay space để phân cấp đoạn mã sẽ giúp dễ dàng chỉnh sửa hay tìm ra lỗi.
    Nginx làm việc như thế nào
    Xác định các chỉ thị (Defining the Directives)
    Chúng tôi sẽ bắt đầu bằng việc giải thích các đoạn mã trong /etc/nginx/nginx.conf . Hãy trở lại với phần đầu tiên:
    Mã:
    user www-data;
    worker_processes 4;
    pid /run/nginx.pid;
    
    events {
            worker_connections 768;
            # multi_accept on;
    }
    
    user
    Định nghĩa cho biết người dùng hệ thống Linux nào sẽ có quyền chạy các máy chủ Nginx.Có những trường hợp sử dụng nhất định mà được hưởng lợi từ việc thay đổi người dùng,. Ví dụ, bạn chạy hai máy chủ web cùng một lúc, hoặc cần người sử dụng của một chương trình khác để có thể kiểm soát Nginx.

    worker_process
    Xác định có bao nhiêu cores của CPU làm việc với Nginx. Nginx sẽ sử dụng một CPU để xử lý các tác vụ của mình. Tùy theo mức độ hoạt động của web server mà chúng ta có thể thay đổi lại thiết lập này.
    Ví dụ với các web server hay sử dụng về SSL, gzip thì ta nên đặt chỉ số của worker_processes này lên cao hơn. Nếu website của bạn có số lượng các tệp tin tĩnh nhiều, và dung lượng của chúng lớn hơn bộ nhớ RAM thì việc tăng worker_processes sẽ tối ưu băng thông đĩa của hệ thống.

    Để xác định số cores của CPU của hệ thống ta có thể thực hiện lệnh
    Mã:
    cat /proc/cpuinfo | grep processor[CODE]
    [CODE]
    [root@server ~]# cat /proc/cpuinfo | grep processor
    processor    : 0
    processor    : 1
    processor    : 2
    processor    : 3
    
    Như ở trên, CPU của chúng ta có 4 cores. Để thay đổi mức sử dụng CPU của nginx ta sửa tệp tin cấu hình chính
    Mã:
    vi /etc/nginx/nginx.conf

    Tại dòng worker_processes ta thay đổi giá trị của worker_processes là 4.

    pid

    Xác định nơi Nginx sẽ ghi lại master process ID, hoặc PID. PID được sử dụng bởi hệ điều hành để theo dõi và gửi tín hiệu đến quá trình Nginx.

    worker_connections
    sẽ cho biết số lượng connection mà CPU sẽ xử lý. Mặc định, số lượng connection này được thiết lập là 1024. Để xem về mức giới hạn sử dụng của hệ thống bạn có thể dụng lệnh ulimit
    Mã:
    ulimit –n
    Con số thiết lập của worker_connections nên nhỏ hơn hoặc bằng giới hạn này!

    HTTP (Universal Configuration)
    Phần tiếp theo của tập tin nginx.conf bao gồm các đoạn mã chung giúp Nginx xử lý lưu lượng web HTTP. Phần đầu tiên của khối HTTP được hiển thị dưới đây:
    Mã:
    http {
    
        ##
        # Basic Settings
        ##
    
        sendfile on;
        tcp_nopush on;
        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;
        default_type application/octet-stream;
    
        ##
        # Logging Settings
        ##
    
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
    
        ##
        # Gzip Settings
        ##
    
        gzip on;
        gzip_disable "msie6";
    
    Hầu hết khối http {} làm việc với hầu hết các cấu hình Nginx. Chúng tôi sẽ nó rõ các tùy chọn cấu hình sau đây:

    include

    Chỉ thị include (include /etc/nginx/mime.types) của nginx có vai trò trong việc thêm nội dung từ một file khác vào trong cấu hình nginx. Điều này có nghĩa là bất cứ điều gì được viết trong tập tin mime.types sẽ được hiểu là nó được viết bên trong khối http {}.
    Điều này cho phép bạn bao gồm một số lượng dài của các chỉ thị trong khối http {} mà không gây lộn xộn lên các tập tin cấu hình chính. Và nó giúp tránh quá nhiều dòng mã cho mục đích dễ đọc.
    Bạn luôn có thể bao gồm (include) tất cả các tập tin trong một thư mục nhất định với các chỉ thị:
    Mã:
    include /etc/nginx/sites-enabled/*;
    Bạn cũng có thể bao gồm tất cả file theo một định dạng nào đó, như ví dụ sau:
    Mã:
    include /etc/nginx/conf.d/*.conf; --> Nó sẽ bao gồm các tập tin có đuôi .conf
    gzip
    Chỉ thị gzip sẽ giúp nén các dữ liệu trước khi chuyển chúng tới Client, hạn chế số lượng băng thông sử dụng và tắng tốc độ dịch chuyển dữ liệu. Điều này tương đương với mod_deflate của Apache. Một số chỉ thị sau đây bạn có thể thêm vào để tăng hiệu quả của gzip, nhớ phải uncommnet mới có hiệu quả.
    Mã:
    # 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/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
    Đối với định nghĩa đầy đủ các tùy chọn gzip, kiểm tra trang này từ các tài liệu Nginx.

    Cấu hình tên miền ảo (Virtual Domains Configuration)
    Khối HTTP của tập tin nginx.conf chứa câu lệnh bao gồm /etc/nginx/sites-enabled/*;. Điều này cho phép cấu hình khối máy chủ được load từ các file riêng biệt được tìm thấy trong thư mục sites-enabled.
    Thông thường đây là những liên kết đến tập tin lưu trữ trong /etc/nginx/sites-available/. Bằng cách sử dụng liên kết, bạn có thể nhanh chóng kích hoạt hoặc vô hiệu hóa một Virtual Host trong khi vẫn giữ tập tin cấu hình của nó.
    Nginx cung cấp một tập tin Virtual Host mặc định duy nhất, có thể được sử dụng như là một khuôn mẫu để tạo ra các tập tin Virtual Host cho các tên miền khác:
    Mã:
    cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
    Bây giờ chúng ta hãy đi qua các chỉ thị và thiết lập:
    Mã:
    
    server {
            listen 80 default_server;
            listen [::]:80 default_server ipv6only=on;
    
            root /usr/share/nginx/html;
            index index.html index.htm;
    
            # Make site accessible from http://localhost/
            server_name localhost;
    
            location / {
                    # First attempt to serve request as file, then
                    # as directory, then fall back to displaying a 404.
                    try_files $uri $uri/ /index.html;
                    # Uncomment to enable naxsi on this location
                    # include /etc/nginx/naxsi.rules
            }
    }
    
    Khối server là nơi người dùng Nginx sẽ dùng để cấu hình các chỉ thị cho từng domain của họ. Nói chung, bạn sẽ muốn tạo một tập tin riêng biệt với khối server riêng cho từng miền ảo trên máy chủ của bạn. Nhiều tùy chọn cấu hình cho khối server được trình bày trong các phần sau.

    Cổng nghe (Listening Ports)
    Việc chỉ thị Listen, mà nằm trong khối server, cho biết hostname/IP của Nginx và cổng TCP nơi cần lắng nghe cho các kết nối HTTP. Theo mặc định, Nginx sẽ lắng nghe cho các kết nối HTTP trên cổng 80.
    Tiếp theo chúng tôi sẽ trình bày một vài ví dụ phổ biến cho các chỉ thị listen. Bạn có thể dùng nhiều hơn hơn một chỉ thị listen.

    Mã:
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    
    Câu lệnh default_server trên có nghĩa là máy chủ ảo sẽ trả lời yêu cầu trên cổng 80 và nó không đặc biệt đúng với câu lệnh listen của virtual host khác. Dòng thứ hai ở trên được sử dụng với IPv6 và hoạt động trong cùng một cách.

    Một số cách khai báo cho chỉ thị listen như sau:
    Mã:
    listen     127.0.0.1:80;
    listen     localhost:80;
    
    Cặp thứ hai của ví dụ trên cho biết Nginx lắng nghe trên 127.0.0.1; đó là interface loopback.

    Mã:
    listen     127.0.0.1:8080;
    listen     localhost:8080;
    
    Cặp thứ ba của ví dụ cho biết Nginx lắng nghe trên 127.0.0.1; thay vi cổng 80 mà sử dụng cổng 8080

    Mã:
    listen 192.168.3.105:80;
    listen 192.168.3.105:8080;
    
    Cặp thứ tư của ví dụ cho biết Nginx lắng nghe các yêu cầu trên địa chỉ IP 192.168.3.105. Việc đầu tiên lắng nghe trên cổng 80 và lần thứ hai vào cổng 8080.

    Tên dựa trên Virtual Host (Names-base Virtual Host)
    Chỉ thị server_name, mà nằm trong khối server, cho phép người quản trị cung cấp tên dựa trên Virtual Host . Điều này cho phép nhiều tên miền được cung cấp từ một địa chỉ IP duy nhất.
    Thông thường, bạn sẽ muốn tạo ra một tập tin cho mỗi tên miền mà bạn muốn lưu trữ trên máy chủ của bạn. Mỗi tập tin nên có khối server riêng của mình, và chỉ thị server_name là nơi mà bạn chỉ định tên miền sẽ bị ảnh hưởng.
    Tiếp theo chúng tôi sẽ trình bày một vài ví dụ phổ biến cho các chỉ thị server_name:
    Mã:
    server_name example.com;
    Ví dụ trên Nginx sẽ xử lý yêu cầu cho example.com. Đây là cấu hình cơ bản nhất.

    Mã:
    server_name example.com [URL='http://www.example.com/']www.example.com[/URL];
    Ví dụ thứ hai, Nginx sẽ xử lý yêu cầu cho cả hai example.com và www.example.com.

    Mã:
    server_name *.example.com;
    server_name .example.com;
    
    Hai ví dụ trên là tương đương với nhau, Nginx sẽ xử lý yêu cầu cho tất cả các tên miền phụ của example.com, bao gồm www.example.com, foo.example.com, vv

    Mã:
    server_name example.*;
    Ví dụ thứ tư, Nginx sẽ xử lý yêu cầu cho tất cả các tên domain bắt đầu với ví dụ., Bao gồm example.com, example.org, example.net, example.foo.com, vv

    Mã:
    server_name example.com linode.com icann.org;
    
    Ví dụ thứ năm, Nginx sẽ xử lý yêu cầu ba tên domain khác nhau. Lưu ý rằng bất kỳ sự kết hợp của các tên miền có thể được liệt kê trong một chỉ thị server_name duy nhất.

    Mã:
    server_name localhost linode galloway;
    
    Nginx cho phép bạn chỉ định tên cho các Virtual Host mà không phải là tên miền hợp lệ. Nginx sử dụng tên từ các tiêu đề HTTP để trả lời yêu cầu; nó không quan trọng đối với Nginx nếu tên domain hợp lệ hay không. Trong trường hợp này, các hostames có thể được quy định trong /etc/hosts.

    Access Logs
    Chỉ thị access_log có thể được thiết lập trong khối http trong nginx.conf hoặc trong khối server cho một domain ảo cụ thể. Nó thiết lập vị trí của access log của Nginx.
    Bằng việc xác định access_log đến một đường dẫn khác nhau trong mỗi khối server, bạn có thể sắp xếp các đầu ra cụ thể cho mỗi tên miền ảo thành tập tin riêng của mình.

    Bạn có thể sử dụng một đường dẫn tương đối đến thư mục hiện tại:
    Mã:
    access_log logs/example.access.log;
    Hoặc, bạn có thể sử dụng một đường dẫn đầy đủ:
    Mã:
     access_log /srv/www/example.com/logs/access.log;
    Bạn cũng có thể vô hiệu hóa các bản ghi truy cập, mặc dù điều này không được khuyến cáo:
    Mã:
    access_log off;
    Location (File and Folder Configuration)
    Thành phần cuối cùng của khối cài đặt server là các khối location. Chúng tôi sẽ bao gồm các chi tiết cụ thể những gì diễn ra bên trong một khối location trong phần tiếp theo; ngay bây giờ chúng ta sẽ tập trung vào các thiết lập cấu hình cơ bản.

    Cũng giống như các chỉ thị server_name cho biết Nginx làm thế nào để xử lý yêu cầu cho các tên miền, chẳng hạn như http://example.com, khối location bao gồm các yêu cầu cho các tập tin cụ thể và thư mục, chẳng hạn như http://example.com/blog/.

    Chú ý: Bạn có thể có nhiều hơn một khối location
    Mã:
    location / { }
    location /images/ { }
    location /blog/ { }
    location /planet/ { }
    location /planet/blog/ { }
    
    Vì vậy, ví dụ, nếu ai đó yêu cầu:
    Request: http://example.com/
    Return: Giả sử có một mục server_name cho example.com, địa điểm chỉ thị / sẽ xác định những gì sẽ xảy ra với yêu cầu này.

    Nginx luôn đáp ứng yêu cầu sử dụng thông tin cụ thể nhất. Vì vậy, ví dụ:
    Request: http://example.com/planet/blog/ hoặc http://example.com/planet/blog/about/
    Return: Điều này được thực hiện bởi các location /planet/blog/ bởi vì nó là cụ thể hơn, mặc dù location /planet/ cũng phù hợp với yêu cầu này.

    Mã:
    location ~ IndexPage\.php$ { }
    location ~ ^/BlogPlanet(/|/index\.php)$ { }
    
    Khi một khối location được theo sau bởi một dấu ngã (\ ~), Nginx thực hiện một kết hợp biểu thức chính qui. Các kết hợp luôn luôn phân biệt chữ hoa. Vì vậy, IndexPage.php sẽ phù hợp với ví dụ đầu tiên ở trên, nhưng indexpage.php sẽ không được.

    Trong ví dụ thứ hai, biểu thức chính qui ^/BlogPlanet (/|index\.php) $ sẽ phù hợp với các yêu cầu /BlogPlanet/ và /BlogPlanet/index.php, nhưng không phù hợp /BlogPlanet, /blogplanet/ hoặc /blogplanet/index. php. Nginx sử dụng Perl Compatible Regular Expressions (PCRE).

    Mã:
    location ~* \.(pl|cgi|perl|prl)$ { }
    location ~* \.(md|mdwn|txt|mkdn)$ { }
    
    Nếu bạn muốn kết hợp được trường hợp phân biệt chữ hoa, sử dụng một dấu ngã với một dấu sao (\ ~ *). Những ví dụ trên tất cả các chỉ định cách Nginx xử lý yêu cầu kết thúc bằng một phần mở rộng tập tin cụ thể.
    Trong ví dụ đầu tiên, bất kỳ tập tin kết thúc bằng: .pl, .PL, .cgi, .CGI, .perl, .Perl, .prl, and .PrL sẽ phù hợp với yêu cầu.
    Hãy chắc chắn rằng mỗi tập tin và thư mục theo một tên miền sẽ phù hợp với ít nhất một khối location.

    Khối location dành cho root và index
    Ta có ví dụ minh họa sau:
    Mã:
    location / {
    root html;
    index index.html index.htm;
    }
    
    Trong ví dụ này, các tài liệu gốc (root) nằm trong thư mục html/. Với tiền tố cài đặt mặc định cho Nginx, đường dẫn đầy đủ đến vị trí này là /etc/nginx/html/.
    Request: http://example.com/blog/includes/style.css
    Return: Nginx sẽ cố gắng để xử lý các tập tin nằm ở /etc/nginx/html/blog/includes/style.css

    Bạn có thể sử dụng đường dẫn tuyệt đối cho các chỉ thị gốc (root) nếu muốn.
    Biến chỉ số index sẽ giúp Nginx biết tập tin nào để xử lý nếu không được chỉ định. Ví dụ:
    Request: http://example.com
    Return: Nginx sẽ cố gắng để xử lý các tập tin nằm ở /etc/nginx/html/index.html.

    Nếu nhiều tập tin được chỉ định cho chỉ thị index, Nginx sẽ xử lý danh sách theo thứ tự và thực hiện đầy đủ yêu cầu với tập tin đầu tiên mà tồn tại. Nếu index.html không tồn tại trong thư mục có liên quan, sau đó index.htm sẽ được sử dụng để xử lý. Nếu không có tập tin nào tồn tại, Nginx sẽ trả về lổi 404.

    Ta có một ví dụ phức tạp hơn:
    Mã:
    
    location / {
        root   /srv/www/example.com/public_html;
        index  index.html index.htm;
    }
    
    location ~ \.pl$ {
        gzip off;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
        fastcgi_index index.pl;
        fastcgi_param SCRIPT_FILENAME /srv/www/www.example.com/public_html$fastcgi_script_name;
    }
    
    Trong ví dụ này, tất cả các yêu cầu về nguồn tài nguyên mà kết thúc bằng một phần mở rộng .pl được xử lý bởi các khối location thứ hai, trong đó xác định một bộ xử lý FastCGI.

    Nếu không, Nginx sử dụng các khối location đầu tiên. Tài nguyên được đặt trên hệ thống tập tin tại /srv/www/example.com/public_html/. Nếu không có tên tập tin được quy định trong yêu cầu, Nginx sẽ tìm kiếm và cung cấp file index.html hoặc index.htm. Nếu không có tập tin index nào được tìm thấy, máy chủ sẽ trả về một lỗi 404.

    Hãy phân tích những gì xảy ra trong một vài yêu cầu:
    Request: http://example.com/
    Return: /srv/www/example.com/public_html/index.html nếu file index.html tồn tại. Nếu tập tin đó không tồn tại, ngixn sẽ xử lý /srv/www/example.com/public_html/index.htm. Nếu cả 2 tập tin (index.html, index.htm) đều không tồn tại, Nginx trả về một lỗi 404.

    Request: http://example.com/blog/
    Return: /srv/www/example.com/public_html/blog/index.html nếu file index.html tồn tại. Nếu tập tin đó không tồn tại, ngixn sẽ xử lý /srv/www/example.com/public_html/blog/index.htm. Nếu cả 2 tập tin (index.html, index.htm) đều không tồn tại, Nginx trả về một lỗi 404.

    Request: http://example.com/tasks.pl
    Return: Nginx sẽ sử dụng bộ xử lý FastCGI để thực thi các tập tin nằm ở /srv/www/example.com/public_html/tasks.pl và trả về kết quả.

    Request: http://example.com/username/roster.pl
    Return Nginx sẽ sử dụng bộ xử lý FastCGI để thực thi các tập tin nằm ở /srv/www/example.com/public_html/username/roster.pl và trả kết quả.
     
Tags:

Chia sẻ trang này

Đang tải...