Cách xây dựng NGINX từ nguồn trên Ubuntu 18.04 LTS

theanh

Administrator
Nhân viên
NGINX(phát âm là"engine x") là phần mềm máy chủ web nguồn mở được thiết kế hướng đến tính đồng thời cao, có thể được sử dụng làmmáy chủ HTTP/HTTPS,máy chủ proxy ngược,máy chủ proxy thư,bộ cân bằng tải phần mềm,bộ chấm dứt TLS,máy chủ lưu trữ đệm...

Đây là một phần mềm cực kỳ mô-đun. Ngay cả một số phần mềm có vẻ "tích hợp sẵn", chẳng hạn như GZIP hoặc SSL, thực tế được xây dựng dưới dạng các mô-đun có thể được bật và tắt trong thời gian xây dựng.

Nó có các mô-đuncốt lõi(gốc)các mô-đun của bên thứ ba (bên ngoài)https://www.nginx.com/resources/wiki/modules/index.html?utm_source=diendancongnghe.comdo cộng đồng tạo ra. Hiện tại, có hơn một trăm mô-đun của bên thứ ba mà chúng ta có thể sử dụng.

Được viết bằng ngôn ngữC, đây là phần mềm rất nhanh và nhẹ.

Cài đặt NGINX từ mã nguồn tương đối "dễ" - tải xuống phiên bản mới nhất của mã nguồn NGINX, cấu hình, xây dựng và cài đặt.

Bạn sẽ cần phải chọn tải xuống phiên bảnchínhhayổn định, nhưng việc xây dựng chúng hoàn toàn giống nhau.



Trong hướng dẫn này, chúng ta sẽ xây dựng NGINX với tất cả các mô-đun có sẵn trong phiên bản mã nguồn mở của NGINX và chúng ta sẽ sử dụng phiên bảnmainline1.15.0tại thời điểm viết bài này. Cập nhật số phiên bản khi có phiên bản mới hơn.

Phiên bản ổn định so với phiên bản chính​

NGINX mã nguồn mở có sẵn trong hai phiên bản:
  • Mainline– Bao gồm các tính năng mới nhất và bản sửa lỗi và luôn được cập nhật. Nó đáng tin cậy, nhưng có thể bao gồm một số mô-đun thử nghiệm và cũng có thể có một số lỗi mới.
  • Ổn định– Không bao gồm tất cả các tính năng mới nhất, nhưng có các bản sửa lỗi quan trọng luôn được đưa ngược trở lại phiên bản chính.

Mô-đun cốt lõi so với mô-đun của bên thứ ba​

NGINX có hai loại mô-đun mà bạn có thể sử dụng:mô-đun cốt lõimô-đun của bên thứ ba.

Mô-đun cốt lõi được xây dựng bởi các nhà phát triển NGINX cốt lõi và chúng là một phần của chính phần mềm.

Mô-đun của bên thứ ba được xây dựng bởi cộng đồng và bạn có thể sử dụng chúng để mở rộng chức năng NGINX. Có rất nhiều mô-đun của bên thứ ba hữu ích, nổi tiếng nhất trong số đó là: PageSpeed, ModSecurity, RTMP, Lua, v.v...

Mô-đun tĩnh so với mô-đun động​

Mô-đun tĩnh tồn tại trong NGINX ngay từ phiên bản đầu tiên. Mô-đun động được giới thiệu với NGINX 1.9.11+ vào tháng 2 năm 2016.

Với mô-đun tĩnh, tập hợp các mô-đun tạo thành nhị phân NGINX được cố định tại thời điểm biên dịch bằng tập lệnh ./configure. Các mô-đun tĩnh sử dụng cú pháp --with-foo_bar_modulehoặc--add-module=PATH.

Để biên dịch mô-đun lõi (chuẩn) thành động, chúng ta thêm=dynamic, ví dụ--with-http_image_filter_module=dynamic.

Để biên dịch mô-đun của bên thứ ba thành động, chúng ta sử dụng cú pháp--add-dynamic-module=/path/to/modulevà sau đó chúng ta tải chúng bằng cách sử dụng load_modulechỉ thị trong ngữ cảnh toàn cục của tệp nginx.conf.

Yêu cầu để xây dựng NGINX từ source​

So với một số phần mềm UNIX/Linux khác, NGINX khá nhẹ và không có nhiều thư viện phụ thuộc. Cấu hình xây dựng mặc định chỉ phụ thuộc vào 3 thư viện được cài đặt:OpenSSL/LibreSSL/BoringSSL,ZlibPCRE.
[*] Yêu cầu tùy chọn:LƯU Ý: NGINX cũng có thể được biên dịch dựa trênLibreSSLBoringSSLthư viện mã hóa thay vìOpenSSL.

Yêu cầu​

  • Máy chủ chạy Ubuntu 18.04 LTS.
  • Người dùng không phải root có quyền sudo.

Các bước ban đầu​

Kiểm tra phiên bản Ubuntu:
Mã:
lsb_release -ds 
# Ubuntu 18.04 LTS
Thiết lập múi giờ:
Mã:
timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'
Cập nhật các gói hệ điều hành của bạn:
Mã:
sudo apt update&&sudo apt upgrade -y

Xây dựng NGINX từ nguồn​

NGINX là một chương trình được viết trong C, vì vậy trước tiên bạn sẽ cần cài đặt một công cụ biên dịch. Cài đặt build-essential, gittreecác gói:
Mã:
sudo apt install -y build-essential git tree
Tải xuống phiên bản chính mới nhất của mã nguồn NGINX và trích xuất nó. Mã nguồn NGINX được phân phối dưới dạng tệp nén (tarball nén gzipped), giống như hầu hết các phần mềm Unix và Linux:
Mã:
wget https://nginx.org/download/nginx-1.15.0.tar.gz && tar zxvf nginx-1.15.0.tar.gz
Tải xuống mã nguồn của các phụ thuộc NGINX bắt buộc và giải nén chúng:
Mã:
# Phiên bản PCRE 8.42
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz && tar xzvf pcre-8.42.tar.gz

# phiên bản zlib 1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz

# phiên bản OpenSSL 1.1.0h
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz && tar xzvf openssl-1.1.0h.tar.gz
Cài đặt các phụ thuộc NGINX tùy chọn:

Mã:
sudo add-apt-repository -y ppa:maxmind/ppa
sudo apt update && sudo apt upgrade -y 
sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev
Dọn dẹp tất cả các tệp.tar.gz. Chúng ta không cần chúng nữa:
Mã:
rm -rf *.tar.gz
Nhập thư mục nguồn NGINX:
Mã:
cd ~/nginx-1.15.0
Để đảm bảo, hãy liệt kê các thư mục và tệp tạo nên mã nguồn NGINX với tiện ích tree:
Mã:
tree -L 2 .
Sao chép trang hướng dẫn NGINX vào /usr/share/man/man8/thư mục:

Mã:
sudo cp ~/nginx-1.15.0/man/nginx.8 /usr/share/man/man8
sudo gzip /usr/share/man/man8/nginx.8
ls /usr/share/man/man8/ | grep nginx.8.gz
# Kiểm tra xem trang Man cho NGINX có hoạt động không:
man nginx


Để được trợ giúp, bạn có thể xem danh sách đầy đủ các tùy chọn thời gian biên dịch NGINX được cập nhật bằng cách chạy:
Mã:
./configure --help
# Để xem các module lõi muốn có thể được xây dựng như chạy động:
./configure --help | grep -F =dynamic
Cấu hình, biên dịch và cài đặt NGINX:
Mã:
./configure --prefix=/etc/nginx \ 
 --sbin-path=/usr/sbin/nginx \ 
 --modules-path=/usr/lib/nginx/modules \ 
 --conf-path=/etc/nginx/nginx.conf \
 --error-log-path=/var/log/nginx/error.log \
 --pid-path=/var/run/nginx.pid \
 --lock-path=/var/run/nginx.lock \
 --user=nginx \
 --group=nginx \
 --build=Ubuntu \
 --builddir=nginx-1.15.0 \
 --with-select_module \
 --with-poll_module \
 --with-threads \
 --with-file-aio \
 --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_auth_request_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-perl_modules_path=/usr/share/perl/5.26.1 \
 --with-perl=/usr/bin/perl \
 --http-log-path=/var/log/nginx/access.log \
 --http-client-body-temp-path=/var/cache/nginx/client_temp \
 --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
 --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
 --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
 --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
 --with-mail=động \
 --with-mail_ssl_module \
 --with-stream=động \
 --with-stream_ssl_module \
 --with-stream_realip_module \
 --with-stream_geoip_module=động \
 --with-stream_ssl_preread_module \
 --with-compat \
 --with-pcre=../pcre-8.42 \
 --with-pcre-jit \
 --with-zlib=../zlib-1.2.11 \
 --with-openssl=../openssl-1.1.0h \
 --with-openssl-opt=no-nextprotoneg \
 --with-debug


make
sudo make install
Sau khi xây dựng NGINX, điều hướng đến thư mục home (~):
Mã:
cd ~
Liên kết tượng trưng/usr/lib/nginx/modulesđến/etc/nginx/modulesthư mục.etc/nginx/moduleslà một vị trí chuẩn cho các mô-đun NGINX:

Mã:
sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules
In phiên bản NGINX, phiên bản trình biên dịch và cấu hình các tham số tập lệnh:
Mã:
sudo nginx -V
# phiên bản nginx: nginx/1.15.0 (Ubuntu)
# được xây dựng bởi gcc 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
# được xây dựng với OpenSSL1.1.0h 27 tháng 3 năm 2018
# Hỗ trợ TLS SNI được bật
# cấu hình đối số: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules
# . . .
# . . .
Tạo nhóm hệ thống và người dùng NGINX:
Mã:
sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx
Kiểm tra cú pháp NGINX và các lỗi tiềm ẩn:
Mã:
sudo nginx -t
# Sẽ báo lỗi này -> nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" không thành công (2: Không có tệp hoặc thư mục nào như vậy)

# Tạo thư mục bộ đệm NGINX và thiết lập quyền thích hợp
sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp
sudo chmod 700 /var/cache/nginx/*
sudo chown nginx:root /var/cache/nginx/*

# Kiểm tra lại cú pháp và tiềm năng lỗi.
sudo nginx -t
Tạo tệp đơn vị systemd NGINX:
Mã:
sudo vim /etc/systemd/system/nginx.service
Sao chép/dán nội dung bên dưới vào tệp /etc/systemd/system/nginx.service:
Mã:
[Đơn vị]Mô tả=nginx - máy chủ web hiệu suất caoTài liệu=https://nginx.org/en/docs/Sau=network-online.target remote-fs.target nss-lookup.targetMuốn=network-online.target[Dịch vụ]Type=forkingPIDFile=/var/run/nginx.pidExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.confExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s TERM $MAINPID[Cài đặt]WantedBy=multi-user.target
Cho phép NGINX khởi động khi khởi động và khởi động NGINX ngay lập tức:
Mã:
sudo systemctl enable nginx.service
sudo systemctl start nginx.service
Kiểm tra xem NGINX có tự động khởi tạo sau khi khởi động lại không:
Mã:
sudo systemctl is-enabled nginx.service
# enabled
Kiểm tra xem NGINX có đang chạy không bằng cách chạy một trong các lệnh sau:
Mã:
sudo systemctl status nginx.service
# hoặc
ps aux | grep nginx
#hoặc
curl -I 127.0.0.1
Bạn cũng có thể mở trình duyệt và điều hướng đến tên miền/địa chỉ IP của mình để xem trang NGINX mặc định. Đó là dấu hiệu cho thấy NGINX đang hoạt động.



Tạo hồ sơ ứng dụng NGINX Tường lửa đơn giản (UFW):
Mã:
sudo vim /etc/ufw/applications.d/nginx
Sao chép/dán nội dung bên dưới vào /etc/ufw/applications.d/nginxtệp:
Mã:
[Nginx HTTP]title=Máy chủ web (Nginx, HTTP)description=Máy chủ web nhỏ nhưng rất mạnh mẽ và hiệu quảcổng=80/tcp[Nginx HTTPS]title=Máy chủ web (Nginx, HTTPS)description=Máy chủ web nhỏ nhưng rất mạnh mẽ và hiệu quảcổng=443/tcp[Nginx Full]title=Máy chủ web (Nginx, HTTP + HTTPS)description=Máy chủ web nhỏ nhưng rất mạnh mẽ và hiệu quảcổng=80,443/tcp
Xác minh rằng các cấu hình ứng dụng UFW đã được tạo và nhận dạng:
Mã:
sudo ufw app list

# Các ứng dụng khả dụng:
# Nginx Full
# Nginx HTTP
# Nginx HTTPS
# OpenSSH
Theo mặc định, NGINX tạo các tệp sao lưu.defaulttrong/etc/nginx. Xóa các tệp .defaultkhỏi thư mục /etc/nginx:
Mã:
sudo rm /etc/nginx/*.default
Đặt tô sáng cú pháp của cấu hình NGINX cho trình soạn thảo Vim vào ~/.vim:
Mã:
# Đối với người dùng không phải root thông thườngmkdir ~/.vim/cp -r ~/nginx-1.15.0/contrib/vim/* ~/.vim/# Đối với người dùng rootsudo mkdir /root/.vim/sudo cp -r ~/nginx-1.15.0/contrib/vim/* /root/.vim/
LƯU Ý: Bằng cách thực hiện bước trên, bạn sẽ có cú pháp tô sáng đẹp khi chỉnh sửa Tệp cấu hình NGINX trong trình soạn thảo Vim.



Tạoconf.d,snippets,sites-availablesites-enabledthư mục trong/etc/nginxthư mục:
Mã:
sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}
Thay đổi quyền và quyền sở hữu nhóm của tệp nhật ký NGINX:
Mã:
sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log
Tạo cấu hình logrotation cho NGINX.
Mã:
sudo vim /etc/logrotate.d/nginx
Điền nội dung bên dưới vào tệp, sau đó lưu và thoát:
Mã:
/var/log/nginx/*.log { daily missingok rotate 52 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript}
Xóa tất cả các tệp đã tải xuống khỏi thư mục gốc:
Mã:
cd ~
rm -rf nginx-1.15.0/ openssl-1.1.0h/ pcre-8.42/ zlib-1.2.11/
Vậy là xong. Bây giờ, bạn đã cài đặt phiên bản NGINX mới nhất bằng cách xây dựng nó từ mã nguồn. Nó được biên dịch tĩnh so với một số thư viện quan trọng như OpenSSL. Thông thường, phiên bản OpenSSL do hệ thống cung cấp đã lỗi thời. Bằng cách sử dụng phương pháp cài đặt này với phiên bản OpenSSL mới hơn, bạn có thể tận dụng các mã hóa mới nhưCHACHA20_POLY1305và các giao thức nhưTLS 1.3sẽ có trong OpenSSL1.1.1.Ngoài ra, bằng cách biên dịch nhị phân của riêng bạn, bạn có thể tùy chỉnh chức năng mà NGINX của bạn sẽ cung cấp, linh hoạt hơn nhiều so với việc cài đặt nhị phân được dựng sẵn.
 
Back
Bên trên