Markdown

[NGINX] 開發環境設定

NGINX 設定

純文字瀏覽器

在終端機下面要看到網頁結果怎麼辦
上網查一下還真的有終端機下的瀏覽器
Installation of Lynx and Links
https://www.tecmint.com/command-line-web-browsers/
links http:127.0.0.1 或是 lynx http:/127.0.0.1
不過這不是長久辦法
前輩看到我用termianl開網頁都快QQ惹
教我一招方便的方法可以直接讓外部連進VM上的server
首先先搞清楚PHP NGINX 的關係
NGINX 原本只能代理HTML,為了讓他能夠解析.php結尾的檔名,
必須使用php-fpm來讓nginx認識
php-fpm 系蝦咪挖溝
全名是 FastCGI Process Manager
快速通用閘道器介面(Fast Common Gateway Interface/FastCGI)是一種讓互動程式與Web伺服器通訊的協定。FastCGI是早期通用閘道器介面(CGI)的增強版本。
FastCGI致力於減少網頁伺服器與CGI程式之間互動的開銷,從而使伺服器可以同時處理更多的網頁請求。

歷史
CGI使外部程式與Web伺服器之間互動成為可能。CGI程式運行在獨立的進程中,並對每個Web請求建立一個進程,這種方法非常容易實現,但效率很差,難以擴展。面對大量請求,進程的大量建立和消亡使操作系統效能大大下降。此外,由於位址空間無法共享,也限制了資源重用。

實現
與為每個請求建立一個新的行程不同,FastCGI使用持續的行程來處理一連串的請求。這些行程由FastCGI伺服器管理,而不是web伺服器。 當進來一個請求時,web伺服器把環境變數和這個頁面請求通過一個socket比如FastCGI行程與web伺服器(都位於本地)或者一個TCP connection(FastCGI行程在遠端的server farm)傳遞給FastCGI行程。
這篇有說明他們的關係
https://segmentfault.com/q/1010000004854045
Nginx和PHP-FPM的进程间通信有两种方式,一种是TCP,一种是UNIX Domain Socket.
其中TCP是IP加端口,可以跨服务器.而UNIX Domain Socket不经过网络,只能用于Nginx跟PHP-FPM都在同一服务器的场景.用哪种取决于你的PHP-FPM配置:
方式1:
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf: fastcgi_pass 127.0.0.1:9000;
方式2:
php-fpm.conf: listen = /tmp/php-fpm.sock
nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock;
其中php-fpm.sock是一个文件,由php-fpm生成,类型是srw-rw----.

UNIX Domain Socket可用于两个没有亲缘关系的进程,是目前广泛使用的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的.这种通信方式是发生在系统内核里而不会在网络里传播.UNIX Domain Socket和长连接都能避免频繁创建TCP短连接而导致TIME_WAIT连接过多的问题.对于进程间通讯的两个程序,UNIX Domain Socket的流程不会走到TCP那层,直接以文件形式,以stream socket通讯.如果是TCP Socket,则需要走到IP层,对于非同一台服务器上,TCP Socket走的就更多了.

UNIX Domain Socket:
Nginx <=> socket <=> PHP-FPM
TCP Socket(本地回环):
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
TCP Socket(Nginx和PHP-FPM位于不同服务器):
Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> PHP-FPM

像mysql命令行客户端连接mysqld服务也类似有这两种方式:
使用Unix Socket连接(默认):
mysql -uroot -p --protocol=socket --socket=/tmp/mysql.sock
使用TCP连接:
mysql -uroot -p --protocol=tcp --host=127.0.0.1 --port=3306
了解關係之後可以來編輯設定檔
檔案位置在
/etc/nginx/conf.d/default.conf
server {
    #原本的
    #server_name example.toright.com;
    
    #改成想要的名子
    server_name test123;
    
    #去哪邊找文件
    root /usr/share/nginx/html;
    
    # "/" 這個路徑預設讀那些檔案
    index index.html index.php index.htmi index.php;
    
    #設定放LOG檔的地方
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # set expiration of assets to MAX for caching
    location ~* \.(ico|css|js|gif|jpe?g|png|ogg|ogv|svg|svgz|eot|otf|woff)(\?.+)?$ {
        expires max;
        log_not_found off;
    }

    server_tokens off;

    # framework rewrite
    location / {
        try_files $uri $uri/ /index.php;
    }


    location ~* \.php$ {
    
        # 改成透過 127.0.0.1:9000 連線
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        include fastcgi_params;
        
        #$document_root 就是上面設定的server root
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

再來到 windows 做連到VM的設定
先打開 C:\Windows\System32\drivers\etc\
編輯host檔,加上對應的DNS設定,填上VM上主機的IP 跟我們設定的NGINX SERVER NAME
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
# 127.0.0.1       localhost
# ::1             localhost
    192.168.109.128  test123
再來就可以在window上打開瀏覽器連到 http://test123 就可以看見nginx的index了。
甚麼是DNS
http://dns-learning.twnic.net.tw/dns/03opDNS.html
DNS分為Client和Server,Client扮演發問的角色,也就是問Server 一個Domain Name,而Server必須要回答此Domain Name的真正IP地址。而當地的DNS先會查自己的資料庫。如果自己的資料庫沒有,則會往該DNS上所設的的DNS尋問,依此得到答案之後,將收到的答案存起來,並回達客戶。真正DNS的運作:有兩種詢問方法,Recursive和Iterative兩種。前面是由DNS代理去問,問的方法是用Iterative方式,後者是由本機直接做Iterative式的詢問。

原本conf.d/default.conf 的設定下去跑 會遇到
[ERROR] php-fpm doesn’t create .sock file
var/run/php-fpm/
更改 etc/nginx/conf.d
將原本的 var/run/php-fpm/php-fpm.sock;
改成 fastcgi_pass 127.0.0.1:9000;
Edit: The real solution here is that the listen in www.conf and fastcgi_pass in nginx configuration have to match. Whether you use sockets or tcp is up to you.
The answer was to not use a .sock file at all. in /etc/php-fpm.d/www.conf it has listen = 127.0.0.1:9000 so in my nginx config I put fastcgi_pass 127.0.0.1:9000; instead of using something like fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

一些指令,用久就背起來了
Stop PHP FPM command: service php-fpm stop

Start PHP FPM command: service nginx start

Restart PHP FPM command: service php-fpm restart

Reload PHP FPM command: service php-fpm reload

Nginx 相關檔案位置:
所有設定檔:/etc/nginx/
主要設定檔:/etc/nginx/nginx.conf
預設設定檔:/etc/nginx/conf.d/default.conf
程序設定檔:/usr/sbin/nginx
log 檔:/var/log/nginx/
html: /usr/share/nginx/html


Windows 如何清除暫存的 DNS Cache
發表於 2010 年 12 月 16 日 由 Tsung
只要是查詢過的 DNS, 都會暫存一段時間, 於 Windows 要清掉 DNS Cache, 要如何清除?
於 Windows 要清掉 DNS Cache
方法1
執行 cmd
ipconfig /flushdns
看到此行字即完成: successfully flushed the dns resolver cache
方法2
控制台 -> 管理工具 -> 服務
重新啟動 DNS Client 和 DHCP Client 服務即可.
https://blog.longwin.com.tw/2010/12/windows-clear-dns-cache-2010/

留言