Nginx
nginx ufak, güçlü ve yüksek performanslı bir web/ters proxy (reverse proxy) sunucu yazılımıdır. Apache ve lighttpd gibi popüler web sunucu yazılımları için iyi bir alternatiftir.
Kurulum
www-servers/nginx paketini kurmadan önce, kullanabildiği USE bayraklarına göz atalım.
Genişletilmiş USE bayrakları
Nginx yeteneklerini artırmak için modülleri kullanır. Bu yaklaşımın faydalarını kullanmak için kurulumu sırasında hangi modüllerin kullanılacağını bazı USE setleri ile ayarlayabilirsiniz.
- HTTP ile ilgili modüller
NGINX_MODULES_HTTP
değişkeniyle, - E-posta özellikleri ile ilgili modüller
NGINX_MODULES_MAIL
değişkeniyle, - Diğer üçüncü parti modüller de
NGINX_ADD_MODULES
değişkeni ile aktifleştirilebilir.
Bu değişkenler /etc/portage/make.conf dosyasında tanımlanmalıdır. Detaylı açıklamaları /usr/portage/profiles/desc/nginx_modules_http.desc ve /usr/portage/profiles/desc/nginx_modules_mail.desc adreslerinde bulunabilir.
Örneğin fastcgi
modülünü etkinleştirmek için:
NGINX_ADD_HTTP="fastcgi"
The above will overwrite the default value of NGINX_MODULES_HTTP and set it to fastcgi
. To enable the fastcgi
module without overwriting the default NGINX_MODULES_HTTP value, the following USE flag notation can be specified in /etc/portage/package.use:
www-servers/nginx NGINX_MODULES_HTTP: fastcgi
USE bayrakları
USE flags for www-servers/nginx Robust, small and high performance http and reverse proxy server
+http
|
Enable HTTP core support |
+http-cache
|
Enable HTTP cache support |
+http2
|
Enable HTTP2 module support |
+pcre2
|
Enable support for pcre2 |
aio
|
Enables file AIO support |
debug
|
Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces |
http3
|
Enable HTTP3 module support |
ktls
|
Enable Kernel TLS offload (kTLS) |
libatomic
|
Use libatomic instead of builtin atomic operations |
pcre
|
Add support for Perl Compatible Regular Expressions |
pcre-jit
|
Enable JIT for pcre |
rtmp
|
NGINX-based Media Streaming Server |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
ssl
|
Enable HTTPS module for http. Enable SSL/TLS support for POP3/IMAP/SMTP for mail. |
test
|
Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently) |
threads
|
Add threads support for various packages. Usually pthreads |
vim-syntax
|
Pulls in related vim syntax scripts |
Emerge
USE bayraklarıı ayarladıysanız, www-servers/nginx paketini kurun:
root #
emerge --ask www-servers/nginx
Kurulumun onaylanması
The default nginx configuration defines a virtual server with the root directory set to /var/www/localhost/htdocs. However due to bug #449136, the nginx ebuild will only create the /var/www/localhost directory and without an index file. To have a working default configuration, create the /var/www/localhost/htdocs directory and simple index file:
root #
mkdir /var/www/localhost/htdocs
root #
echo 'Hello, world!' > /var/www/localhost/htdocs/index.html
nginx paketi, servisi durdurmak, başlatmak ve yeniden başlatmak için yardımcı olan bir servis betiği ile gelir. nginx servisini başlatmak için:
root #
/etc/init.d/nginx start
nginx'in doğru şekilde çalıştığına emin olmak için, web tarayıcınızdan http://localhost adresine gidebilir veya curl gibi bir komut satırı aracını kullanabilirsiniz:
user $
curl http://localhost
Yapılandırma
nginx yapılandırması /etc/nginx/nginx.conf dosyası üzerinde düzenlenir.
Tek site erişimi
Aşağıdaki örnek, (PHP gibi) dinamik özellikleri olmayan tek site yapılandırması içindir.
user nginx nginx;
worker_processes 1;
error_log /var/log/nginx/error_log info;
events {
worker_connections 1024;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
client_header_timeout 10m;
client_body_timeout 10m;
send_timeout 10m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 4 2k;
request_pool_size 4k;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 75 20;
ignore_invalid_headers on;
index index.html;
server {
listen 127.0.0.1;
server_name localhost;
access_log /var/log/nginx/localhost.access_log main;
error_log /var/log/nginx/localhost.error_log info;
root /var/www/localhost/htdocs;
}
}
Birden çok site erişimi
Birden fazla yapılandırma dosyasında daha kolay yönetim sağlamak için include
yönergesi kullanılabilir:
user nginx nginx;
worker_processes 1;
error_log /var/log/nginx/error_log info;
events {
worker_connections 1024;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
client_header_timeout 10m;
client_body_timeout 10m;
send_timeout 10m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 4 2k;
request_pool_size 4k;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 75 20;
ignore_invalid_headers on;
index index.html;
include /etc/nginx/conf.d/*.conf;
}
server {
listen 127.0.0.1;
server_name localhost;
access_log /var/log/nginx/localhost.access_log main;
error_log /var/log/nginx/localhost.error_log info;
root /var/www/localhost/htdocs;
}
server {
listen 443 ssl;
server_name host.tld;
ssl_certificate /etc/ssl/nginx/host.tld.pem;
ssl_certificate_key /etc/ssl/nginx/host.tld.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
ssl_dhparam /etc/ssl/nginx/host.tld.dh4096.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
}
PHP desteği
PHP desteğini açmak için aşağıdaki satırları nginx yapılandırma dosyasına ekleyebilirsiniz. Bu örnekte nginx PHP ile iletişimini UNIX soketi üzerinden yapmakta.
...
http {
...
server {
...
location ~ \.php$ {
# Olmayan dosyalari test edip 404 hatasi ver
# Bu satir olmazsa nginx gelen her .php ile biten istegi incelemeden php-fpm e gonderir
try_files $uri =404;
include /etc/nginx/fastcgi.conf;
fastcgi_pass unix:/run/php-fpm.socket;
}
}
}
Bu şekilde çalışabilmek için PHP FastCGI desteği ile (php-fpm) derlenmiş olmalıdır, bu da fpm
bayrağı ile sağlanır:
root #
echo "dev-lang/php fpm" >> /etc/portage/package.use
Ardından PHP'yi fpm
USE bayrağıyla tekrar derleyelim:
root #
emerge --ask dev-lang/php
UNIX soket iletişimi önerilen yöntemdir
Using UNIX socket communication is the preferred and recommended configuration
For PHP 7.0 and newer PHP versions use following configuration:
listen = /run/php-fpm.socket
listen.owner = nginx
php-fpm'e ait php.ini dosyasında zaman dilimini ayarlayın. Bunun için ilgili zaman dilimini aşağıda <ZAMAN_DİLİMİ>
ile belirtilen yere ekleyin:
date.timezone = <ZAMAN DİLİMİ>
Ardından php-fpm servisini başlatın:
root #
/etc/init.d/php-fpm start
php-fpm servisini açılışta başlamak üzere öntanımlı çalışma seviyesine ekleyin:
root #
rc-update add php-fpm default
nginx servisini yeni yapılandırma ile yeniden yükleyin:
root #
/etc/init.d/nginx reload
Alternatively, for systemd:
root #
systemctl enable php-fpm@7.1
root #
systemctl start php-fpm@7.1
IP adresiyle eirşim kısıtlaması
Sıradaki örneğimiz belirlediğimiz bir sayfaya (bu örnekte /nginx_status) sadece seçtiğimiz kaynaklardan ulaşılabilmesi, bunlar aşağıdaki gibi:
- IP adresleri (Örn. 192.0.2.1 127.0.0.1)
- IP ağ blokları (Örn. 198.51.100.0/24)
olabilir.
- certain hosts (e.g. 192.0.2.1 127.0.0.1)
- and IP networks (e.g. 198.51.100.0/24)
http {
server {
location /nginx_status {
stub_status on;
allow 127.0.0.1/32;
allow 192.0.2.1/32;
allow 198.51.100.0/24;
deny all;
}
}
}
Basit yetkilendirme
nginx kullanıcı adı ve parola sorup yetkilendirme yapma desteğine de sahiptir:
http {
server {
location / {
auth_basic "Authentication failed";
auth_basic_user_file conf/htpasswd;
}
}
}
htpasswd dosyası aşağıdaki şekilde oluşturulabilir:
The htpasswd file can be generated using:
user $
openssl passwd
Geolocation using GeoIP2
The GeoIP2 module makes use of GeoIP2 databases by Maxmind or similar. Using Maxmind is already supported in Gentoo through net-misc/geoipupdate. However, registration of an account is required in order to obtain a free license key and download the free database.
Downloading Maxmind GeoIP2 databases
Once an account is created, install and configure geoipupdate:
root #
emerge --ask net-misc/geoipupdate
Enter the account and license key:
AccountID YOURID
LicenseKey YOURKEY
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country
After that, you'll need to download the databases:
root #
geoipupdate
In order receive updates automatically in the future, add this command to a weekly cronjob or systemd timer.
Add GeoIP2 support to Nginx
To enable to modules and rebuild Nginx:
www-servers/nginx NGINX_MODULES_HTTP: geo geoip2
The geoip module only supports the GeoIP legacy database.
Rebuild nginx with the third party modules enabled:
root #
emerge --ask www-servers/nginx
Once Nginx has been rebuild, point Nginx to the databases and the GeoIP2 variables:
http {
...
geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
auto_reload 5m;
$geoip2_metadata_city_build metadata build_epoch;
$geoip2_data_city_name city names en;
$geoip2_data_city_geonameid city geoname_id;
$geoip2_data_continent_code continent code;
$geoip2_data_continent_geonameid continent geoname_id;
$geoip2_data_continent_name continent names en;
$geoip2_data_country_geonameid country geoname_id;
$geoip2_data_country_code iso_code;
$geoip2_data_country_name names en;
$geoip2_data_country_is_eu is_in_european_union;
$geoip2_data_location_accuracyradius location accuracy_radius;
$geoip2_data_location_latitude location latitude;
$geoip2_data_location_longitude location longitude;
$geoip2_data_location_metrocode location metro_code;
$geoip2_data_location_timezone location time_zone;
$geoip2_data_postal_code postal code;
$geoip2_data_rcountry_geonameid registered_country geoname_id;
$geoip2_data_rcountry_iso registered_country iso_code;
$geoip2_data_rcountry_name registered_country names en;
$geoip2_data_rcountry_is_eu registered_country is_in_european_union;
$geoip2_data_region_geonameid subdivisions 0 geoname_id;
$geoip2_data_region_iso subdivisions 0 iso_code;
$geoip2_data_region_name subdivisions 0 names en;
}
geoip2 /usr/share/GeoIP/GeoLite2-ASN.mmdb {
auto_reload 5m;
$geoip2_data_autonomous_system_number autonomous_system_number;
$geoip2_data_autonomous_system_organization autonomous_system_organization;
}
...
}
The auto_reload
option will allow updating the database without restarting Nginx.
For the GeoIP2 values to show up in a PHP application, assign them as fastcgi_param
values:
...
fastcgi_param GEOIP2_CITY_BUILD_DATE $geoip2_metadata_city_build;
fastcgi_param GEOIP2_CITY $geoip2_data_city_name;
fastcgi_param GEOIP2_CITY_GEONAMEID $geoip2_data_city_geonameid;
fastcgi_param GEOIP2_CONTINENT_CODE $geoip2_data_continent_code;
fastcgi_param GEOIP2_CONTINENT_GEONAMEID $geoip2_data_continent_geonameid;
fastcgi_param GEOIP2_CONTINENT_NAME $geoip2_data_continent_name;
fastcgi_param GEOIP2_COUNTRY_GEONAMEID $geoip2_data_country_geonameid;
fastcgi_param GEOIP2_COUNTRY_CODE $geoip2_data_country_code;
fastcgi_param GEOIP2_COUNTRY_NAME $geoip2_data_country_name;
fastcgi_param GEOIP2_COUNTRY_IN_EU $geoip2_data_country_is_eu;
fastcgi_param GEOIP2_LOCATION_ACCURACY_RADIUS $geoip2_data_location_accuracyradius;
fastcgi_param GEOIP2_LATITUDE $geoip2_data_location_latitude;
fastcgi_param GEOIP2_LONGITUDE $geoip2_data_location_longitude;
fastcgi_param GEOIP2_LOCATION_METROCODE $geoip2_data_location_metrocode;
fastcgi_param GEOIP2_LOCATION_TIMEZONE $geoip2_data_location_timezone;
fastcgi_param GEOIP2_POSTAL_CODE $geoip2_data_postal_code;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_GEONAMEID $geoip2_data_rcountry_geonameid;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_ISO $geoip2_data_rcountry_iso;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_NAME $geoip2_data_rcountry_name;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_IN_EU $geoip2_data_rcountry_is_eu;
fastcgi_param GEOIP2_REGION_GEONAMEID $geoip2_data_region_geonameid;
fastcgi_param GEOIP2_REGION $geoip2_data_region_iso;
fastcgi_param GEOIP2_REGION_NAME $geoip2_data_region_name;
fastcgi_param GEOIP2_ASN $geoip2_data_autonomous_system_number;
fastcgi_param GEOIP2_ASN_ORG $geoip2_data_autonomous_system_organization;
Üçüncü parti modüller
Üçüncü parti modülü indirip /usr/src dizinine koyun. Ardından elle derleyip, /etc/portage/make.conf dosyasına şu şekilde ekleyin:
NGINX_ADD_MODULES="/usr/src/nginx_modülünün_ismi"
Üçüncü parti modül ile nginx'i tekrar derleyin:
root #
emerge --ask nginx
Kullanım
Servis kontrolü
OpenRC
Nginx'i başlatmak:
root #
/etc/init.d/nginx start
Nginx'i durdur:
root #
/etc/init.d/nginx stop
Nginx'i öntanımlı çalışma seviyesine ekle:
root #
rc-update add nginx default
Reload nginx configuration without dropping connections:
root #
rc-service nginx reload
Nginx'i yeniden başlat:
root #
/etc/init.d/nginx restart
systemd
Start nginx web server:
root #
systemctl start nginx
Stop nginx web server:
root #
systemctl stop nginx
Check the status of the service:
root #
systemctl status nginx
Enable service to start automatically on system reboot:
root #
systemctl enable nginx
Reload nginx configuration without dropping connections:
root #
systemctl reload nginx
Restart the nginx service:
root #
systemctl restart nginx
Olası Problemler
Problem yaşarsanız aşağıdaki komutlar sebebini bulmanıza yardımcı olabilir.
Yapılandırmayı onaylama
nginx ayar dosyalarının belirgin bir hatası olmadığını kontrol etmek için:
root #
/usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx komutunu -t
parametresi ile çalıştırırsanız, servis başlatmadan sadece kontrolleri yapacaktır.
İşlemlerin çalıştığına emin olun
nginx işlemlerinin çalıştığına emin olun:
user $
ps aux | egrep 'nginx|PID'
PID TTY STAT TIME COMMAND 26092 ? Ss 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 26093 ? S 0:00 nginx: worker proces
Adres ve portların kullanımda olduğuna emin olun
nginx servisinin doğru portları dinlediğinden emin olun (HTTP için 80 ve HTTPS için 443 gibi):
root #
netstat -tulpen | grep :80
tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN 0 12336835 -26092/nginx: master
Ayrıca bkz.
Harici kaynaklar
- http://nginx.org/en/docs/beginners_guide.html - nginx hakkında yeni başlayanlara yönelik bir klavuz.
- http://nginx.com/resources/admin-guide/ - Yönetimini yapanlar için Nginx admin klavuzu.
- http://wiki.nginx.org/Main - nginx Wiki.
- https://github.com/h5bp/server-configs-nginx - H5BP nginx yapılandırması.