搭建開始前,我們先來梳理下web服務工作流程,先看下圖:
1、用戶(PC)向web服務器發起http請求
2、web服務器判斷用戶請求文件是否為靜態文件,是則直接讀取靜態文件并返回給用戶,不是則通過WSGI協議將請求丟給web框架(django)代碼處理
3、看web框架是否啟動django中間件,如果啟用,則依據中間件對請求進行修改,如果不啟用,則進入下一步
4、web框架中的路由程序將根據請求中的url文件名將請求路由至相應py文件
5、相應py文件收到請求后根據用戶提交的參數進行計算(期間可能會調用數據庫),然后返回計算后的結果和自定義頭部信息以及狀態碼返回
6、web框架將返回的數據打上通用標識符(頭部信息)后返回給web服務器
7、web服務器打上web服務器的通用標識符(頭部信息)后返回給用戶
8、用戶收到返回的數據
通過上面可以看到django框架基于WSGI協議和web服務器進行交互,那么WSGI協議又是什么呢? 咱們用代碼來說明(偽代碼。
寫一個簡易的遵循WSGI協議的web服務器軟件和django程序):
WSGI服務器的程序:
class WSGI_WEB(object):
def __init__(self):
# 1. 創建套接字
self.tcp_server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2. 綁定
self.tcp_server_socket.bind(("", 7890))
# 3. 變為監聽套接字
self.tcp_server_socket.listen(128)
def set_response_header(self, status, headers):
self.status=status
self.headers=[("server", "WSGI_simple_web v1.0")]
self.headers +=headers
def run(self):
new_socket, client_addr=self.tcp_server_socket.accept()
env=new_socket.recv(1024)
body=application(env, set_response_header) # env是web服務器接收到瀏覽器發送來的數據包;set_response_header為web服務器的一個方法地址,目的是讓django幫web服務器生成http頭部(不是以return的形式給web服務器);此外還有這里調用django里的應用還有一個最核心的任務,就是獲取返回數據的body!
header=self.status + self.headers
response=header + body
new_socket.send(response.encode("utf-8"))
django的app程序:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
問題:
在生產環境中使用django提供的簡易web服務器性能太差,一般只用于調試。強大的nginx又不支持WSGI,那么怎么辦呢?
方案:
在nginx和python應用之間加一層支持WSGI協議的web服務器。以后靜態文件由nginx進行處理,動態文件丟給WSGI服務器,然后WSGI服務器再丟給web框架處理。最理想的支持WSGI協議的web服務器就是uWSGI。
下面來詳細介紹下搭建uWSGI服務器以及與nginx聯動的方法:
1、安裝uWSGI(支持WSGI的WEB服務器):
centos下python3.6安裝uWSGI方法:
yum install -y gcc* pcre-devel openssl-devel python36-devel.x86_64
pip3.6 install uwsgi
2、開啟uWSGI服務
方式一:
uwsgi --http 192.168.31.123:80 --file teacher/wsgi.py --static-map=/static=static
--http 監聽IP端口
--file 項目wsgi.py文件路徑
--static-map 靜態文件路徑
注意: 執行這條命令的時候:一定要在這個項目目錄中~
方式二(使用配置文件):
vi uwsgi.ini:
[uwsgi]
# 監聽端口(nginx采用反向代理模式時必填)
http=0.0.0.0:8888
# 項目目錄
chdir=/opt/test/test1/
# 啟動uwsgi的用戶名和用戶組
uid=root
gid=root
# 指定項目的application(我猜是這里的“test1.wsgi”拼接上面的項目目錄后,就將項目中的wsgi.py文件和uWSGI服務器關聯起來了)
module=test1.wsgi:application
# 指定sock的文件路徑(nginx采用本地模式時必填)
socket=/opt/test/script/uwsgi.sock
# 啟用主進程
master=true
# 進程個數
workers=5
pidfile=/opt/test/script/uwsgi.pid
# 自動移除unix Socket和pid文件當服務停止的時候
vacuum=true
# 序列化接受的內容,如果可能的話
thunder-lock=true
# 啟用線程
enable-threads=true
# 設置自中斷時間
harakiri=30
# 設置緩沖
post-buffering=4096
# 設置日志目錄
daemonize=/opt/test/script/uwsgi.log
# 設置隔多久加載一次項目代碼
py-autoreload=1
執行配置文件(注意:這里用什么賬戶執行的,以后滲透進來獲取到的就是什么賬戶。所以這一步切忌不要用root執行。):
uwsgi --ini uwsgi.ini
彩蛋:
重啟uWSGI進程: uwsgi --reload uwsgi.pid # 代碼做變更后uWSGI進程不會立即加載,此時可以重啟一下uWSGI進程讓它生效。。。是不是感覺有點坑,沒事,可以在配置文件中設置py-autoreload
關閉uWSGI進程: uwsgi --stop uwsgi.pid
3、配置nginx
方式一(反向代理模式):
upstream uwsgi{
server 10.10.10.29:8888;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://uwsgi; # 通過反向代理和uWSGI服務器關聯
}
}
方式二(本地模式):
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
include uwsgi_params; # 指定nginx和uWSGI服務器的通信方式
uwsgi_connect_timeout 30;
uwsgi_pass unix:/opt/test/script/uwsgi.sock; # 通過sock文件和uWSGI服務器關聯! 因為nginx會去讀取.sock文件,所以需要關閉selinux才行!!!
}
}
4、此時訪問django的admin管理后臺時,靜態資源會調取失敗。這時可以將該項目所有靜態資源統一收集到一個文件夾下,然后由nginx統一去調取,真正做到動靜分離(動的給uWSGI,靜的由nginx直接調取):
在settings.py中加入:
TATIC_ROOT=os.path.join(BASE_DIR, 'static_file')
執行如下命令(搜集項目中所有靜態文件至'static_file'目錄):
python3.6 manage.py collectstatic --noinput
此時會在項目目錄下生成一個'static_file'文件夾,內含admin和所有app涉及的靜態文件 。
在nginx中配置靜態文件路徑(如果nginx和uWSGI不屬同一臺服務器可以使用反向代理的方式來調取靜態文件):
location /static/ {
alias /opt/test/test1/static_file/;
}
此時就可以訪問基于python后臺的web網站了。
當然不能只為游戲外掛去學習,學習多個技術,提升自己,你會發現其中很多小秘密都是貫通的,在此小編幫助大家整理了一套python教程,如果自己零基礎或者進階的基本都有合適的,下面展示了部分,希望也能幫助對編程感興趣,如果能幫到你請點贊、點贊、點贊:
電子書系列:
點贊,收藏并轉發文章后,進入小編主頁,看以下圖片操作:
一、前言】
本文章主要講解Nginx的基礎搭建(如果有不知道web服務器的可以百度,或者我再做一篇圖解web)。
Nginx在互聯網中作為一個不可或缺的組件,我們看到LNMP集成環境。LNMP(Linux+Nginx+Mysql+Php);如果只知道這個不知道Nginx的搭建過程的話我們有Nginx的主要特性會錯過。比如Nginx的優點:
高可用(一個組件可以服務上千人)
熱部署(可以做到不停機就能升級基礎設施服務)
反向代理(通常可以,上游反向代理,下游負載均衡處理外部請求)
【二、Nginx搭建】
1、首先先下載一個版本。
2、Nginx版本分支
3、版本如下:
1)MainLine Version(主線版本開發)
2)Stable(穩定版本)
3)Legacy Version(歷史版本)-- 如果項目需要上到選定版本可以選這個
4、下載(我們以Nginx Stable Version為例子)。我們能看到Stable Version底下有三個欄目:
1)CHANGE-1.16 是介紹這個版本和上個版本的區別
2)Nginx-1.16 pgp 這個是Linux版本下載選項,將會下載倒tar.gzNginx/Windows
3)1.16.1 這個是Windows系統下載的,將會下載window包
【三、Nginx文件目錄(如下)】
1、文件目錄如下所示:
2、文件內容解析如下:
1)conf(存放配置文件):Nginx.conf(主要的建站配置文件夾)
2)contrib(是一些Linux的Vim配置文件):作用是將整個vim文件移動到~/.vim/profile目錄底下,就會在vim下有高亮表現
3)doc (documentation 文檔目錄):一些日志改變以及readme文檔還有License授權
4)html(默認的html,網站的入口):
5)logs(默認的日志文件夾)
6)temp(臨時文件目錄)
【四、Windows下搭建】
首先需要解決如何對下一頁的網址進行請求的問題。可以點擊下一頁的按鈕,觀察到網站的變化分別如下所示:
1、Windows下我們直接點擊Nginx根目錄下的Nginx.exe即可立即使用了。閃退是正常現象,之后檢查端口查看是否被占用,第一次啟動推薦使用命令行啟用 :
.\nginxpath\nginx.exe(一直停留不變則說明開啟成功)
2、 然后我們打開網址:
http://localhost:80
3、這樣就是成功 如果失敗了看下面。使用Windows + R啟動命令行,擁有最高權限,輸入命令:
netstart -ano | findstr 80 #找到占用的pid號。
4、然后將其kill掉,命令如下:
taskkill /F /pid
5、之后在使用最開始的方法啟動即可。
【五、Linux環境下(Centos下)搭建】
2、首先先安裝被依賴的插件,命令如下:
yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
3、之后依次如此下列的命令,記得看注釋噢~
tar -zxvf Nginx-1.16.1.tar.gz
cd Nginx-1.16.1
# 這下面幾步驟是進行加載vim插件的,使其在修改conf的時候可以進行常亮
cd contrib
mv contrib ~/.vim
cd ..
# path自己需要安裝的地方
./configure -prefix=/path/Nginx
# configure完成后即可,make && make install去
# configure 是進行配置化操作
# make 是進行編譯操作
# make install 是進行編譯后文件的部署行為
# 為了方便就將make && make install 一起進行
4、之后運行Nginx,命令如下:
cd /nginxInStallPath
./Nginx
#沒有任何信息則是運行成功了。Linux的沒有任何消息就是最好的消息
curl http://localhost
5、至此Nginx搭建完成。下列命令是一些常規的操作命令:
./Nginx -s reload #重新加載(Nginx能做到熱部署的一個原因)
./Nginx -s stop #關閉服務器
./Nginx -t # 可以測試剛修改的Nginx.conf能否生效
【六、Nginx.conf配置】
1、下面是進行Nginx.conf配置,命令如下:
# 下面是進行Nginx.conf配置
cd conf
vim Nginx.conf
2、修改文件中的內容如下所示:
worker_processes number;
# error_log path #錯誤日志文件位置
# error_log path notice 提醒錯誤文件位置
# error_log path info 一些Logger::info的輸出位置
events {
work_connections 1024; #定義最大連接數量
}
# http 定義http的位置(高難度配置下章在講解)
http {
include mine.types; #定義包含類型,網頁請求request_type的地方屬性值設置地方在mine.types文件里賣你
default_type:application/ocet-stream #設置屬性流
sendfile on; #從一個 buffer到另一個 buffer的拷貝用于優化速度
#tcp_nopush on;
keepalive_timeout 60; #設置請求超時時間
server {
listen 80 # 設置監聽的端口
server_name localhost # 設置監聽的域名
charset koi8-r #設置字符集
#access_log logs/host.access.log main #設置主訪問日志存儲
location / { #設置正則表達式匹配localhost/底下的目錄按照此位置進行處理,
#下篇文章配置php會用到
root html; #設置網站根目錄為html路徑
index index.html index.htm; #設置沒有確定的資源文件下,會自動訪問index.hmtl例如
# 例如訪問http://localhost會實際訪問http://localhost/index.html
# 或者 http://localhost/index.htm
}
error_page 404 /404.html #自定義錯誤頁面代碼下訪問的頁面
error_page 500 502 503 504 /50x.html
location=/50.html { #訪問路徑為50x.html 無論是500, 502, 503, 504, 505這些頁面
root html;
}
# location ~\.php$ {
# proxy_pass http://127.0.0.1;
# }
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
#location ~/\.ht {
# deny all;拒絕所有用戶訪問
# }
}
# 底下是配置https,https是現在還在比較流行的一種安全web服務器的基本要求
https {
}
}
【七、總結】
1、Nginx是現代互聯網企業中不可缺少的一門技術,在微服務中也極為重要,尤其反向代理所帶來的抗風險能力極為重要,熱部署能力。
2、本文主要講述了Nginx在windows和Linux系統下的搭建過程,希望對搭建的學習有幫助。
想學習更多Python網絡爬蟲與數據挖掘知識,可前往專業網站:http://pdcfighting.com/
批量導出當前開發環境的包信息
pip freeze > requirements.txt
下載requirements內的包及其依賴到【某文件夾】
pip download -r requirements.txt
.whl文件
只有本地對應版本的Python才能安裝這些包,如果想要要搭建pip鏡像站并兼容更多版本的Python怎么辦呢?
這里有一個網站
https://www.lfd.uci.edu/~gohlke/pythonlibs/
里面有常用的532個包,每一個對應的有各種版本的whl文件,一共6000+
這就要爬蟲了,我寫了一個,代碼就不貼了,已上傳github
https://github.com/tjxj/whlFilesCrawler
本地安裝pip2pi
pip install pip2pi
命令行切換到下載的 .whl文件夾,建立索引(自動生成了index.html)
dir2pi -S 【某文件夾】
然后文件夾內就出現了一個simple文件夾,這里的內容就和阿里、清華、豆瓣的源差別沒那么大了。
準備好Linux or Windows 的 Nginx 安裝程序
http://nginx.org/en/download.html
將【某文件夾】和Nginx 安裝包一起copy到內網的服務器
Nginx 安裝很簡單,Terminal里執行nginx不報錯就算大功告成。
找到nginx.conf文件,僅需修改如下幾個內容,其他的都不需要動:
server{
listen 80;
server_name 你的IP地址
root 【某文件夾】的路徑
}
重啟nginx服務器
# Linux
sudo systemctl restart nginx
# Windows
nginx -s reload
瀏覽器打開 http://你的IP/simple
現在如果內網的服務器墻是通的,其他機器應該也能訪問這個網址,pip 鏡像站就搭建好了,so easy。
如果內網內的主機想要pip安裝所需的包,還需要配置一下pip
在 Linux & macOS 中,配置需要寫到 ~/.pip/pip.conf 文件中;Windows 中,配置文件位置為 %HOMEPATH%\pip\pip.ini,%HOMEPATH% 即你的用戶文件夾,一般為“\Users<你的用戶名>”,具體值可以使用 echo %HOMEPATH% 命令查看。
通常你需要手動創建對應的目錄和文件,然后寫入下面的內容:
[global]
index-url=http://你的IP/simple
[install]
trusted-host=你的IP
內網的主機安裝Python的包及其依賴
pip install [所需的包名]
*請認真填寫需求信息,我們會在24小時內與您取得聯系。